2010-04-28 51 views
10
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之间有什么区别?模板显式专业化和普通功能有什么区别?

+1

你不能专注于功能模板,效果会和普通的重载一样。 – AshleysBrain 2010-04-28 10:29:32

+5

@AshleysBrain:这是错误的。您可以专门设计功能模板。你只能做部分专业化。 – sbi 2010-04-28 10:34:39

+0

哦,这就是我的意思。谢谢。 – AshleysBrain 2010-04-28 10:40:07

回答

10
  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); 
} 

参见:

+0

我刚刚修复了代码中的错别字,对不起, – 2010-04-28 10:56:10

+0

增加了gotw链接,与@Michael给出的那些相同 – 2010-04-28 10:59:33

+0

thanx我明白了:) – Suri 2010-04-28 11:18:52

2

模板参数的匹配规则与重载函数的细微差别。什么可以当你尝试调用max()不同tyoes的争论中可以看出不同的例子:

max(1,'2'); 

这将匹配重载函数,但无论是基本模板,也没有专业化。

+0

在我最初的代码读取中,我发现在重载和特化之间的签名没有区别,其他比模板。那么,为什么'max(1,'2')'不能与专业相匹配呢?更具体地说,为什么'1',一个'int',在过载情况下转换为'char',而不是在专业化情况下? – rcollyer 2010-04-28 13:34:25

+0

@rcollyer:在格雷戈里的回答中查看引用*#66 *。 – 2010-04-28 17:40:45

+0

@rcollyer:简单的答案是:_因为标准说so._'template <> void max(...)'是模板__specialization__的语法; 'void max(...)'是函数__overload__的语法。匹配重载函数的规则与匹配模板特化的规则不同。 (首先选择重载,并且只有在选择了模板的情况下,才考虑可能的特殊化。)为什么选择重载比选择特化要轻松得多,我不能说。但是我猜想,现在会制定重载规则,他们也会更严格。 – sbi 2010-04-28 17:44:22