2011-07-24 43 views
3

我有兴趣创建一个函数Derivative,该函数返回一个函数,该函数是传递给它的某个函数的派生函数。但是,我希望能够专注于此,因此,对于特定功能,我可以返回解析解决方案。D中函数的类型

所以,我正在寻找这样的事情:

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); } 

不过,我现在有B样条这样定义的:

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; 
} 

所以对B样条类型签名将是真正的函数(Real,Real),这与其他类型的函数不可区分。是否可以通过opCall定义来解决这个问题以创建一个“BSpline”类?或者我可以做一些typedef来识别这个功能?

谢谢!

+2

呃,h是第一函数自由变量,这是怎么回事都发生在那里? –

回答

2

专门的模板,你必须使用:符号:

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

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

顺便说一句,有趣的是有些老师在学校教D,很高兴知道寿 – phaazon