是否可以在mixin模板中为函数生成名称?像这样:
mixin template Generator(string name)
{
@property void mixin(name) pure nothrow // mixin(name) is not valid :(
{
//some cool stuff here
}
}
我希望有人可以拿出更清洁的东西,但这应该可以做您想要的:
mixin template Generator(string name)
{
mixin("alias " ~ name ~ " = _fun;");
@property void _fun pure nothrow
{
//some cool stuff here
}
}
不幸的_fun
是,这也会注入到本地名称空间中,尽管如果您使用Generator
多次,则对的任何调用_fun
都会被拒绝为模棱两可。如果您合法地在_fun
其他地方定义了命名的函数,则可能会遇到问题。
尽管您正在生成多个_funs
,但通过创建的别名发出的调用Generator
并不是模棱两可的,因为它们引用_fun
的是特定模板实例化的作用域:
mixin Generator!"foo";
mixin Generator!"bar";
foo(); // not ambiguous, calls Generator!"foo"._fun
bar(); // not ambiguous, calls Generator!"bar"._fun
_fun(); // ambiguous, rejected by compiler
编辑:只是想抛出我有另一个疯狂的想法:
mixin template Generator(names ...) {
@property void opDispatch(string s)() pure nothrow {
foreach(name ; names) {
static if (s == name) {
// do stuff
}
}
}
}
struct Foo {
mixin Generator!("hello", "goodbye");
}
void main() {
Foo foo;
foo.hello;
foo.goodbye;
}
这样可以避免产生垃圾_fun
,但是确实需要您的类尚未定义opDispatch
。此外,它不能在同一类中多次使用(您不能从同一作用域中的不同mixin模板重载相同的方法),您必须调用一次并将所有名称作为args传递。但是,如果您希望一次性发送所有名称并且尚未定义,那么这可能是更好的选择opDispatch
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句