Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么时候更喜欢纯函数重载而不是模板(重载)?_C++_Function_Templates_Overloading - Fatal编程技术网

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信息