按返回类型重载模板

时间:2015-03-06 20:07:34

标签: c++ templates overloading return-type specialization

Mooing Duck发表评论here“一个函数无法返回多个类型。但是,您可以专门化或委托重载,这样可以正常工作。”

我开始考虑这个问题,而我想弄明白,这个法律代码是怎样的:

template <typename T>
T initialize(){ return T(13); }

使用时调用:

auto foo = initialize<int>();
auto bar = initialize<float>();

这不会转换为仅由return-type重载的2个同名函数吗?

2 个答案:

答案 0 :(得分:6)

这不是一个过载,它是一个专业化。它们是不同的机制(实际上混合两者可能会导致混淆,因为在考虑专业化之前解决了过载问题 - 请参阅Sutter的Mill文章,例如:http://www.gotw.ca/publications/mill17.htm)。

答案 1 :(得分:6)

这里有一个不允许的返回值只有重载的例子:

int initialize();
float initialize();

OTOH,给出主要模板定义

template <typename T>
T initialize(){ return T(13);}

引自here

  

为了编译函数调用,编译器必须首先执行名称查找,对于函数,可能涉及依赖于参数的查找,而对于函数模板,可能后跟模板参数推断。如果这些步骤产生多个候选函数,则执行重载解析以选择实际调用的函数。

initialize<int>initialize<float>只是所述模板的两个不同实例。它们是两个不同的函数,不会成为潜在重载决策候选列表的一部分。