【问题标题】:How to distinguish between overloads of a templated function如何区分模板化函数的重载
【发布时间】:2016-08-26 11:10:56
【问题描述】:

将非模板函数分配给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)

【问题讨论】:

  • 现在我正在使用声明void _fn2(T)(T val) 的hacky 解决方案,它只是转发到fn2 的单参数重载。

标签: templates metaprogramming d


【解决方案1】:

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

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;
}

【讨论】:

  • 我想我必须接受这个。它确实改变了文档的生成方式,但这并不是什么大不了的事。我想知道这是否会影响模板膨胀——如果我只使用第一个重载,fn!int 会生成多个函数而不是一个函数吗?
  • 实例化模板fn 会生成这两个函数,所以如果只使用一个,那么你会体验到一些模板膨胀,是的。我还应该注意,reported before 也有类似的问题。那里显示了一些替代解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 2017-05-04
相关资源
最近更新 更多