тип функции в D - PullRequest
       49

тип функции в D

3 голосов
/ 24 июля 2011

Я заинтересован в создании производной функции, которая возвращает функцию, являющуюся производной некоторой функции, которая передается ей в какой-то момент.Тем не менее, я хочу иметь возможность специализировать это так, чтобы по конкретным функциям я мог вернуть аналитическое решение.

Итак, я ищу что-то вроде этого:

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 будет реальной функцией (Real, Real), которая не отличается от функций любого другого типа.Есть способ решить эту проблему, чтобы создать класс "BSpline" с определенным opCall?Или я могу сделать какое-то определение типа для определения этой функции?

Спасибо!

1 Ответ

2 голосов
/ 10 декабря 2012

Чтобы специализировать шаблон, вы должны использовать нотацию ::

auto foo(alias F_, X_)(X_ x) {
    /* code here ... */
}

auto foo(alias F_ : BSpline, X_)(X_ x) {
    /* specialized version here */
}
...