2010-04-28 45 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