引入緣由:編寫單一的模板,它能適應大衆化,使每種類型都具備相同的功能,但對於某種特定類型,若是要實現其特有的功能,單一模板就沒法作到,這時就須要模板特例化。
定義:是對單一模板提供的一個特殊實例,它將一個或多個模板參數綁定到特定的類型或值上。
函數模板特例化:必須爲原函數模板的每一個模板參數都提供實參,且使用關鍵字template後跟一個空尖括號對<>,代表將原模板的全部模板參數提供實參。
template<typename T> //函數模板
int compare(const T &v1,const T &v2) { if(v1 > v2) return -1; if(v2 > v1) return 1; return 0; } //模板特例化,知足針對字符串特定的比較,要提供全部實參,這裏只有一個T
template<>
int compare(const char* const &v1,const char* const &v2) { return strcmp(p1,p2); }
特例化版本時,函數參數類型必須與先前聲明的模板中對應的類型匹配,其中T爲const char*。
本質:特例化的本質是實例化一個模板,而非重載它。特例化不影響參數匹配。參數匹配都以最佳匹配爲原則。例如,此處若是是compare(3,5),則調用普通的模板,若爲compare(「hi」,」haha」)則調用特例化版本(由於這個cosnt char*相對於T,更匹配實參類型),注意,兩者函數體的語句不同了,實現不一樣功能。
注意:普通做用於規則使用於特例化,即,模板及其特例化版本應該聲明在同一個頭文件中,且全部同名模板的聲明應該放在前面,後面放特例化版本。
類模板特例化:原理相似函數模板,不過在類中,咱們能夠對模板進行特例化,也能夠對類進行部分特例化。對類進行特例化時,仍然用template<>表示是一個特例化版本,例如:
template<>
class hash<sales_data> { size_t operator()(sales_data&); //裏面全部T都換成特例化類型版本sales_data
};
按照最佳匹配原則,若T != sales_data,就用普通類模板,不然,就使用含有特定功能的特例化版本。
類模板的部分特例化:沒必要爲全部模板參數提供實參,能夠指定一部分而非全部模板參數,一個類模板的部分特例化自己還是一個模板,使用它時還必須爲其特例化版本中未指定的模板參數提供實參。此功能就用於STL源碼剖析中的traits編程。詳見C++primer 628頁的例子。(特例化時類名必定要和原來的模板相同,只是參數類型不一樣,按最佳匹配原則,那個最匹配,就用相應的模板)
特例化類中的部分紅員:能夠特例化類中的部分紅員函數而不是整個類。
template<typename T>class Foo { void Bar(); void Barst(T a)(); }; template<>
void Foo<int>::Bar() { //進行int類型的特例化處理
} Foo<string> fs; Foo<int> fi;//使用特例化
fs.Bar();//使用的是普通模板,即Foo<string>::Bar()
fi.Bar();//特例化版本,執行Foo<int>::Bar()//Foo<string>::Bar()和Foo<int>::Bar()功能不一樣