[疑难] 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部分可以直接丢掉。 |