C++ 什么时候更喜欢纯函数重载而不是模板(重载)?
我无法用谷歌搜索出这个问题的答案 什么时候应该使用模板、模板重载和普通函数重载 我喜欢总是使用模板,感觉输入更少,代码更通用,但我开始质疑自己,为什么人们在有模板的时候会使用函数重载 我所看到的唯一区别是,对于模板,默认模板声明将处理所有特殊情况下不会处理的情况,而对于普通函数,我们必须编写至少两倍的代码 同样在下面的第三个示例中,有时一个模板就足够了。 所以这里的主要问题是,为什么要为简单的函数重载而烦恼呢 例如:C++ 什么时候更喜欢纯函数重载而不是模板(重载)?,c++,function,templates,overloading,C++,Function,Templates,Overloading,我无法用谷歌搜索出这个问题的答案 什么时候应该使用模板、模板重载和普通函数重载 我喜欢总是使用模板,感觉输入更少,代码更通用,但我开始质疑自己,为什么人们在有模板的时候会使用函数重载 我所看到的唯一区别是,对于模板,默认模板声明将处理所有特殊情况下不会处理的情况,而对于普通函数,我们必须编写至少两倍的代码 同样在下面的第三个示例中,有时一个模板就足够了。 所以这里的主要问题是,为什么要为简单的函数重载而烦恼呢 例如: void func(int param) { // ... } vo
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)
{
// ...
}
模板
无效tmpl(T参数)
{
// ...
}
模板
无效tmpl(双参数)
{
// ...
}
模板
无效tmpl(字符参数)
{
// ...
}
在大多数情况下,我们甚至不需要重载模板,因为我们关心的只是确保数据类型大小正确,而函数的算法相同
所以在这些情况下,我们可以这样写:
template<typename T>
void tmpl(T param)
{
// ...
}
模板
无效tmpl(T参数)
{
// ...
}
而对于普通函数,我们需要做更多的工作
编辑:
我找到了一个很好的答案,这个答案有点相关,但并没有完全涵盖我的问题:模板专门化和重载之间的一个大区别是重载允许隐式转换参数,而模板专门化不允许。继续您的示例,如何处理
float
参数<将选择code>func(双参数),但将实例化通用模板。通常前者是正确的
更一般地说,有理由选择非模板代码。模板通常必须驻留在标头中,这会减慢编译速度并将实现公开给所有人。模板会导致更隐晦的编译错误消息,而且工具不太支持模板。例如,Visual studio 2015未提供模板的intellisense信息 模板专门化和重载之间的一大区别是重载允许隐式转换参数,而模板专门化不允许。继续您的示例,如何处理
float
参数<将选择code>func(双参数),但将实例化通用模板。通常前者是正确的
更一般地说,有理由选择非模板代码。模板通常必须驻留在标头中,这会减慢编译速度并将实现公开给所有人。模板会导致更隐晦的编译错误消息,而且工具不太支持模板。例如,Visual studio 2015未提供模板的intellisense信息