[疑难] DFL中的奇特函数 void addHandler(TDG)(TDG handler)

ant-man 2007-08-31
小弟刚进D的世界就被她的优美所吸引~
在感受她无穷魅力至于却恨自己学识浅薄,无奈只得翻阅前辈源码,希望从中品味三分
但是出现在dfl.event中的void addHandler(TDG)(TDG handler)东东更让我匪夷所思
那位大侠出面解释下这个东东的奥秘?小弟不胜感激,还愿众大侠不吝赐教!!
void addHandler(TDG)(TDG handler)
in
{
    assert(handler);
}
body
{
    mixin _validateHandler!(TDG);

    addHandlerExact(cast(Handler)handler);
}
oldrev 2007-08-31
模板函数
ant-man 2007-08-31
感谢二楼的答案
同时更衷心感谢qiezi给小弟的指点:

void addHandler(TDG)(TDG handler)
这是定义一个模板方法,TDG是模板参数,你可以查看D语言文档的template部分。这种方法允许你传递任何类型的参数给函数,我猜想下面_validateHandler是为了限制这种任意类型,它可能限制你使用具有某些“特征”的对象,比如有一个XXX方法,你可以看这部分代码详细了解。

mixin _validateHandler!(TDG);
_validateHandler是个模板,感叹号是模板实例化,mixin就是把模板实例化后的代码直接插在这个位置上。

下面的addHandlerExact是个简单的函数调用。

in和body块是契约编程语法,可以在D语言文档的 Contracts部分找到。这里的代码也可以写成:


代码
void addHandler(TDG)(TDG handler)   
{   
assert(handler);  
mixin _validateHandler!(TDG);   
 
addHandlerExact(cast(Handler)handler);  
}  


分开显得更显了,更符合契约规范,而且在release版本中更容易做优化,明确告诉编译器release版本中in/out部分可以直接丢掉。
Global site tag (gtag.js) - Google Analytics