一个非常正式的问题:这被认为是过载吗?删除模板与仅重载参数有根本不同吗?
template<class T> void myFunction(const T& t) {}
void myFunction(const double& t) {}
那么接下来的问题是,遵循这种方法还是使用模板专门化而不是重载更好?
template<> void myFunction(const double& t) {}
首先,根据标准(第 13 节开始):“当两个
或为单个名称指定多个不同的声明
相同的范围,该名称被认为是重载的。[...]只有函数和
函数模板声明可以重载;变量和类型
声明不能超载。”很明显,你们两个
声明是重载。
如果你打电话myFunction( 3.14159 )
,那么模板将是
使用与非模板相同的签名进行实例化,并且两者都会
完全匹配。在这种情况下(§13.3.1):
给定这些定义,可行函数 F1 被定义为
如果对于所有参数,比另一个可行函数 F2 更好的函数
i,ICSi(F1) 不是比 ICSi(F2) 更差的转换序列,并且
然后
[...]
— F1 是非模板函数,F2 是函数模板
专业化,[...]
该标准已指定您的具体情况。
关于专门化功能的替代方案:
根据上面的定义,专业化可能是重载,但是
他们不参与重载决策。专业工作
不同的是:重载解析首先在没有它们的情况下发生;那么,如果
重载决议选择了模板,并且有一个
实例化类型的专业化,专业化是
使用,而不是模板的通用实例化。一般来说
说起来,结果是一样的,尽管http://www.gotw.ca/publications/mill17.htm http://www.gotw.ca/publications/mill17.htm指出一种异国情调(并且
写得不好?)情况并非如此。不过,至少对我来说,似乎
更自然地提供重载函数,而不是
模板专业化。无论如何,大多数时候。 (有一个真实的
例外:有时不提供泛型很有用
实施,但仅限于专业化。根据我的经验,这
这种情况通常发生在特征类中,但也可能发生在
个人功能也是如此。当然,在这种情况下,您可以
专门化模板;否则你不能使用它。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)