3

ある時点で渡される関数の導関数である関数を返す関数Derivativeを作成することに興味があります。ただし、これを特殊化して、特定の機能について分析ソリューションを返すことができるようにしたいと思います。

だから、私はこのようなものを探しています:

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、Real)になります。これは、他の種類の関数と区別できません。これを解決して、opCallが定義された「BSpline」クラスを作成する方法はありますか?または、この関数を識別するために何らかのtypedefを実行できますか?

ありがとう!

4

1 に答える 1

2

テンプレートを特殊化するには、次の:表記を使用する必要があります。

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

auto foo(alias F_ : BSpline, X_)(X_ x) {
    /* specialized version here */
}
于 2012-12-10T09:50:45.420 に答える