【问题标题】:When to prefer plain function overload over templates (overload)?何时更喜欢普通函数重载而不是模板(重载)?
【发布时间】:2019-09-26 02:25:30
【问题描述】:

我无法通过谷歌搜索到这个问题的答案。

什么时候应该使用模板、模板重载和普通函数重载?

我有一个总是使用模板的偏好,感觉像更少的输入和更通用的代码,但开始质疑我自己,为什么当我们有模板时人们还要使用函数重载。

我看到的唯一区别是,在模板的情况下,默认模板声明将处理所有特殊情况不会处理的情况,而对于普通函数,我们必须编写至少两倍的代码。

在下面的第三个示例中,有时单个模板就足够了。 所以这里的主要问题是为什么要为简单的函数重载而烦恼?

例如:

void func(int param)
{
    // ...
}

void func(double param)
{
    // ...
}

void func(char param)
{
    // ...
}

模板也可以达到同样的效果:

template<typename T>
void tmpl(T param)
{
    // ...
}

template<>
void tmpl(double param)
{
    // ...
}

template<>
void tmpl(char param)
{
    // ...
}

在大多数情况下,我们甚至不需要重载模板,因为我们所关心的只是确保数据类型大小正确,而函数的算法相同。

所以在这些情况下,我们可以这样写:

template<typename T>
void tmpl(T param)
{
    // ...
}

虽然使用普通函数,但我们需要做更多的工作。

编辑: 我发现this 很好的答案有点相关,但并没有完全涵盖我的问题:

【问题讨论】:

    标签: c++ function templates overloading


    【解决方案1】:

    模板特化和重载之间的一大区别是重载允许参数的隐式转换,而模板特化则不允许。继续您的示例,float 参数将如何处理? func(double param) 将被选中,但通用模板将被实例化。通常前者是正确的。

    更一般地说,有理由更喜欢非模板代码。模板通常必须驻留在头文件中,这会减慢编译速度并将实现公开给所有人。模板会导致更多神秘的编译错误消息,并且工具不能很好地支持。例如。 Visual Studio 2015 不提供模板的智能感知信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2016-09-24
      • 2011-05-13
      • 1970-01-01
      相关资源
      最近更新 更多