【问题标题】:Is a templated and a nontemplated version of the same function considered an overload?同一函数的模板化版本和非模板化版本是否被视为重载?
【发布时间】:2015-01-27 10:32:32
【问题描述】:

一个非常正式的问题:这是否被认为是超载?删除模板与仅重载参数有根本不同吗?

template<class T> void myFunction(const T& t) {}
void myFunction(const double& t) {}

那么接下来的问题,是遵循这种方法还是使用模板专业化而不是重载更好?

template<> void myFunction(const double& t) {}

【问题讨论】:

  • 您是否阅读过@bolov 在上一个问题中向您建议的the article
  • 我做到了,但我认为明确这一点会很好,我错过了问题第二部分的答案。如果我不想专门化我的主模板,那么首选方法是什么?我认为这个讨论值得提出自己的问题。
  • 我怀疑 SO 能否为 Herb 的讨论增加很多内容。在“重要的道德”下有一个很好的总结。
  • @AntonSavin ty 让我能够基本上支持我自己的评论 :)
  • @molbdnilo 我认为重点不一定是带来新的东西,而是将这些信息带入 Stack Overflow。

标签: c++ templates overloading template-specialization


【解决方案1】:

首先,根据标准(§13 开头):“当两个 在 相同的作用域,据说这个名字是重载的。[...]只有函数和 函数模板声明可以重载;变量和类型 声明不能重载。”很明显,你们两个 声明是重载。

如果你调用myFunction( 3.14159 ),那么模板将会是 使用与非模板相同的签名进行实例化,并且两者都会 完全匹配。在这种情况下(第 13.3.1 节):

鉴于这些定义,一个可行的函数 F1 被定义为 如果所有参数都比另一个可行的函数 F2 更好的函数 i,ICSi(F1) 不是比 ICSi(F2) 更差的转换序列,并且 然后 [...] — F1 是非模板函数,F2 是函数模板 专业化,[...]

标准已指定您的确切情况。

关于专门化功能的替代方案: 根据上面的定义,特化可能是重载,但是 他们不参与重载决议。专业工作 不同的是:重载决议首先在没有它们的情况下发生;那么,如果 重载决议选择了模板,并且有一个 实例化类型的特化,特化是 使用,而不是模板的通用实例化。一般来说 说起来,结果是一样的,虽然 http://www.gotw.ca/publications/mill17.htm 指出一种异国情调(和 写得不好?)他们不是的情况。不过,至少对我来说,似乎 更自然地提供重载功能,而不是 模板专业化。大多数时候,无论如何。 (有一个真实的 例外:有时不提供泛型很有用 实施,但仅限于专业化。根据我的经验,这 这种情况通常发生在特征类中,但也可能发生在 个人功能也是如此。在这种情况下,当然,你做 专门化模板;否则你不能使用它。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多