Я сомневаюсь, что есть какая-то существенная разница, и даже если бы это было так, я бы поспорил, что он, вероятно, оптимизирован во время компиляции. Вы теряете время, когда пытаетесь микро-оптимизировать такие вещи. Сначала сделайте код читаемым и правильным, а затем, если у вас возникла проблема с производительностью, используйте профилировщик, а затем подумайте о выборе лучших структур данных / алгоритмов, если это необходимо, а затем подумайте о том, как оптимизировать детали, которые выделяет профилировщик.
Для каждого n > 0
мы добавляем новую функцию-член, принимающую это значение в качестве аргумента, который наследуется от следующего уровня вниз:
template<int n, typename Real=double>
class f
: public f<n-1, Real>
{
public:
f() { /* initialize dv */ }
using f<n-1, Real>::prime;
Real prime(Real x, integral_constant<int, n>) {
/* find appropriate index for x, and interpolate on dv */
}
protected:
std::vector<Real> dv;
};
Где базовая версия добавляет operator()
: [117 ]
template<typename Real=double>
class f<0, Real>
{
public:
f() { /* initialize v */ }
Real operator()(Real x) { /* find appropriate index for x, and interpolate */}
Real prime(Real x) { return (*this)(x); }
protected:
std::vector<Real> v;
};
Это означает, что первая производная вызывает prime(x, integral_constant<int, 1>{})
, вторая производная вызывает prime(x, integral_constant<int, 2>{})
и т. Д.
Вы можете просто иметь функцию-член шаблона и static_assert, которая гарантирует, что вы не берете производную, которая не поддерживается вашим классом. Например:
template <int n, /* other stuff */>
class f
{
/* Other stuff not shown */
template <int p>
Real prime(Real x)
{
static_assert(p <= n, "unsupported derivative");
/* do whatever you need to to implement the pth derivative */
}
};
Таким образом, объект типа f < 1> будет поддерживать простое < 1> (), но не простое < 2> () и т. Д. Если вы случайно вызовите простое число < 3> для объекта типа f < 1> компилятор вызовет вас на него. Вам решать, хотите ли вы считать prime<0>
идентичным operator ()
или изменить свой static_assert, чтобы включить проверку для p > 0
.