template <class T>
void max (T &a ,T &b)
{}//generic template #1
template<> void max(char &c, char &d)
{} //template specializtion #2
void max (char &c, char &d)
{}//ordinary function #3
1,2和3有什么区别?
答案 0 :(得分:10)
以下摘自C++ Coding Standards: 101 Rules, Guidelines, and Best Practices:
66)不要专门化功能模板
函数模板特化从不参与重载:因此,您编写的任何特化都不会影响使用哪个模板,这与大多数人直观期望的相反。毕竟,如果你用相同的签名而不是函数模板专门化编写了一个nontemplate函数,那么总会选择nontemplate函数,因为它总是被认为是比模板更好的匹配。
本书建议您通过在类模板方面实现函数模板来添加间接级别:
#include <algorithm>
template<typename T>
struct max_implementation
{
T& operator() (T& a, T& b)
{
return std::max(a, b);
}
};
template<typename T>
T& max(T& a, T& b)
{
return max_implementation<T>()(a, b);
}
另见:
答案 1 :(得分:2)
模板参数的匹配规则与重载函数的匹配规则略有不同。当您尝试使用不同类型的参数调用max()
时,可以看到不同的示例:
max(1,'2');
这将匹配重载函数,但既不匹配基本模板也不匹配特化。