函数/委托不匹配重载的模板

时间:2017-02-21 16:12:51

标签: templates d

在向函数传递函数和委托时,看起来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)时可以使用。

  1. 为什么(T a)是所选匹配?
  2. 有没有办法在不明确传递参数的情况下强制进行正确选择,而无需在(Ret function(Args))内调用(T a)

1 个答案:

答案 0 :(得分:0)

来自template specialization docs

  

如果带有序列参数的模板和没有序列参数的模板都与模板实例完全匹配,则选择不带TemplateSequenceParameter的模板。

您可以通过添加isSomeFunction的约束来解决此问题:

void test(T)(T a) if (!isSomeFunction!T) {
    assert(0);
}