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