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之间有什么区别?模板显式专业化和普通功能有什么区别?
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之间有什么区别?模板显式专业化和普通功能有什么区别?
这里的过载是C++ Coding Standards: 101 Rules, Guidelines, and Best Practices摘录:
66)不要专注函数模板
功能模板专业化从不参与重载:因此,您编写的任何专业化版本都不会影响使用哪个模板,这与大多数人直觉上期望的内容背道而驰。毕竟,如果你写了一个具有相同签名而不是函数模板专门化的非模板函数,那么总是会选择非模板函数,因为它总是被认为比模板更好匹配。
这本书建议你在一个类模板方面实现函数模板添加间接的层次:
#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);
}
参见:
我刚刚修复了代码中的错别字,对不起, – 2010-04-28 10:56:10
增加了gotw链接,与@Michael给出的那些相同 – 2010-04-28 10:59:33
thanx我明白了:) – Suri 2010-04-28 11:18:52
模板参数的匹配规则与重载函数的细微差别。什么可以当你尝试调用max()
不同tyoes的争论中可以看出不同的例子:
max(1,'2');
这将匹配重载函数,但无论是基本模板,也没有专业化。
在我最初的代码读取中,我发现在重载和特化之间的签名没有区别,其他比模板。那么,为什么'max(1,'2')'不能与专业相匹配呢?更具体地说,为什么'1',一个'int',在过载情况下转换为'char',而不是在专业化情况下? – rcollyer 2010-04-28 13:34:25
@rcollyer:在格雷戈里的回答中查看引用*#66 *。 – 2010-04-28 17:40:45
@rcollyer:简单的答案是:_因为标准说so._'template <> void max(...)'是模板__specialization__的语法; 'void max(...)'是函数__overload__的语法。匹配重载函数的规则与匹配模板特化的规则不同。 (首先选择重载,并且只有在选择了模板的情况下,才考虑可能的特殊化。)为什么选择重载比选择特化要轻松得多,我不能说。但是我猜想,现在会制定重载规则,他们也会更严格。 – sbi 2010-04-28 17:44:22
你不能专注于功能模板,效果会和普通的重载一样。 – AshleysBrain 2010-04-28 10:29:32
@AshleysBrain:这是错误的。您可以专门设计功能模板。你只能做部分专业化。 – sbi 2010-04-28 10:34:39
哦,这就是我的意思。谢谢。 – AshleysBrain 2010-04-28 10:40:07