在向函数传递函数和委托时,看起来D在选择正确的重载模板时遇到问题。 举个例子:
import std.stdio;
void test()(string a){
writeln(a);
}
void test(Ret, Args...)(Ret function(Args) fn){
writeln(fn(1, 2));
}
void test(T)(T a){
assert(0);
}
void main(){
test("something");
test((int a, double b){
return "works";
});
}
理论上,这应该打印something\nworks
。但这是输出:
something
core.exception.AssertError@test.d(15): Assertion failure
...
删除void test(T)(T a)
时可以使用。
(T a)
是所选匹配?(Ret function(Args))
内调用(T a)
?答案 0 :(得分:0)
来自template specialization docs:
如果带有序列参数的模板和没有序列参数的模板都与模板实例完全匹配,则选择不带TemplateSequenceParameter的模板。
您可以通过添加isSomeFunction
的约束来解决此问题:
void test(T)(T a) if (!isSomeFunction!T) {
assert(0);
}