d改进重载2
原文
理由:目前,查看通过别名参数传递给模板重载集时,不能提取重载集.一般,可用:
__traits(getOverloads, __traits(parent, sym), __traits(identifier, sym))
但只要重载集包含别名或其他模块,此操作就会失败.而
__traits(getOverloads)
始终内部查找符号,所以只需要重定义个单参(当前是错误)来直接传递该符号.
需要定义存在导入重载集时的行为:
// a.d
void foo(int);
void foo(string);
// b.d
void foo();
// c.d
import a;
import b;
__traits(getOverloads, foo); // 哪个?
我在本地测试了一下,只有在同一个模块中定义并使用重载集,才是问题.如,有效的:
// b.d
void first(int) { }
// c.d
void second(string) { }
// a.d
import b : foo = first;
import c : foo = second;
// d.d
import a;
void main()
{
alias overloads = __traits(getOverloads, a, "foo");
static foreach(ov; overloads)
pragma(msg, __traits(identifier, ov));
}
因此,如果知道重载集定义位置,事情就会正常工作.
所以取别名参数的模板现在需要传递调用模块和串?
你在此陷入了一点C++思维.你不应问"能用已拥有的东西做吗",而是"这是好还是坏?",这样做是不好的.没人想你不能写:
templ!foo
你应该写:
templ!(net.foo.CurrentModule, "foo")
并认为是的,这是个很好的,设计良好语言,我应该推荐给其他人.
浙公网安备 33010602011771号