按返回类型重载模板

Overloading template by Return Type

本文关键字:重载 返回类型      更新时间:2023-10-16

Mooing Duck在这里做了一个评论:"一个函数不能返回多个类型。但是,您可以专门化或委托给重载,这工作正常。

开始思考这个问题,我试图弄清楚,这个法典是怎样的:

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

当调用时:

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

这不就是只被返回类型重载的 2 个同名函数吗?

这不是过载,而是专业化。 它们是不同的机制(事实上,将两者混合会导致混淆,因为在考虑专业化之前就解决了重载问题——例如,请参阅这篇 Sutter's Mill 文章:http://www.gotw.ca/publications/mill17.htm)。

下面是不允许的仅返回值重载的示例:

int initialize();
float initialize();

OTOH,给定主模板定义

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

从这里引用

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

initialize<int>initialize<float>只是所述模板的两个不同实例。它们是两个不同的函数,不属于同一潜在过载解决候选列表。