тип функции в D
-
25-10-2019 - |
Вопрос
Я заинтересован в создании производной функции, которая возвращает функцию, которая является производной некоторой функции, которая передается ей, в какой -то момент. Тем не менее, я хочу иметь возможность специализироваться, чтобы для конкретных функций я мог вернуть аналитическое решение.
Итак, я ищу что -то вроде этого:
auto Derivate(alias Function)(x)
{ return (Function(x+h) - Function(x-h))/(2h);}
auto Derivate(BSpline!(k)(x))(x)
{ return k * BSpline!(k-1)(x) + x * BSpline!(k-1)(x); }
Тем не менее, в настоящее время у меня есть BSPLINE, определяемая таким образом:
pure Real BSpline(int k : 0, Real)(scope Real x, scope const(Real)[] t)
{
if (t[0] <= x && x < t[k+1])
return 1;
else
return 0;
}
pure Real BSpline(int k, Real)(scope Real x, scope const(Real)[] t)
{
if (t[0] <= x && x < t[k+1])
{
Real a = (x - t[0]) / (t[k] - t[0]);
Real b = (t[k+1] - x) / (t[k+1] - t[1]);
Real c = BSpline!(k-1,Real)(x, t[0..k+1]);
Real d = BSpline!(k-1,Real)(x, t[1..k+2]);
Real rv = (c?c*a:c) + (d?d*b:d);
return rv;
}
else
return 0;
}
Таким образом, подпись типа на BSPLINE будет реальной функцией (реальной, реальной), которая не отличается от какой -либо другой вида функции. Является ли способ решить это, чтобы создать класс «bspline» с определением Opcall? Или я могу сделать какой -то тип, чтобы определить эту функцию?
Спасибо!
Решение
Чтобы специализировать шаблон, вы должны использовать :
обозначение:
auto foo(alias F_, X_)(X_ x) {
/* code here ... */
}
auto foo(alias F_ : BSpline, X_)(X_ x) {
/* specialized version here */
}