如何区分模板化函数的重载

时间:2016-08-26 11:10:56

标签: templates metaprogramming d

将非模板化函数分配给function类型的变量选择 基于签名的正确重载:

// OK
void fn(int val) {}
void fn(int val, int val2) {}

void function(int) foo = &fn;

然而,我似乎无法对模板化函数做同样的事情:

// template fn!2 matches more than one template declaration
void fn2(T)(T val) {}
void fn2(T)(T val, T val2) {}

void function(int) foo2 = &fn2!int;

如果我可以展开fn2!int,它似乎等同于 第一个案例。

有没有办法让我想要的fn2超载? 请注意,这是在模块级别声明的,所以我不能(据我所知) 使用__traits(getOverloads)

1 个答案:

答案 0 :(得分:2)

解决方法是在同一模板声明中声明两个函数,而不是使用同名的tempalates:

template fn(T)
{
    void fn(T a) { }
    void fn(T a, T b) { }
}

void main()
{
    void function(int) ptr1 = &fn!int;
    void function(int, int) ptr2 = &fn!int;
}