模板特化不同於模板的例項化,模板引數在某種特定型別下的具體實現稱為模板的特化。模板特化有時也稱之為模板的具體化,分別有函式模板特化和類模板特化。
template<> 返回值型別 函式名(形參列表)
函式模板特化是在乙個統一的函式模板不能在所有型別例項下正常工作時,需要定義型別引數在例項化為特定型別時,函式模板的特定實現版本。
如下面的例子,如果不給出函式模板max< t>在t為const char*時的特化版本,那麼在比較兩個字串的大小時,比較的是字串的起始位址的大小,而不是字串的內容在字典序中先後次序。
程式執行結果和使用函式模板特化相同。但是,使用普通函式過載和使用模板特化還是有不同之處,主要表現在如下兩個方面:#include using namespace std;
templatet max(t t1,t t2)
typedef const char* ccp;
template<> ccp max(ccp s1,ccp s2)
int main()
(1)如果使用普通過載函式,那麼不管是否發生實際的函式呼叫,都會在目標檔案中生成該函式的二進位制**。而如果使用模板的特化版本,除非發生函式呼叫,否則不會在目標檔案中包含特化模板函式的二進位制**。這符合函式模板的「惰性例項化」準則。
(2)如果使用普通過載函式,那麼在分離編譯模式下,應該在各個原始檔中包含過載函式的申明,否則在某些原始檔中就會使用模板函式,而不是過載函式。
類模板特化類似於函式模板的特化,即類模板引數在某種特定型別下的具體實現。
程式輸出結果如下:#include using namespace std;
templateclass a
void print()
void print()
a』num:6
a』 special definition
C 模板 模板特化 模板偏特化
模板是c 的乙個重要特性 使用模板 可以極大的減少類似功能 的編寫 這可以看做是c 相較於c的進步 因為這一特性在c中是不容易達到的 語言層面不支援 模板的關鍵字是 template 簡單的模板應用 template class test int main 使用模板的類在例項化時需要指明模板引數型別...
C 模板特化 偏特化
注意 特化時模板引數的先後順序不能變 特化是基於泛化版本進行的 函式模板特化過載與函式過載不衝突 函式模板只能全特化不能偏特化 模板類泛化 templateclass mytest int m func 模板類全特化 template class mytest 模板類偏特化 templateclas...
c 模板特化偏特化
模板為什麼要特化,因為編譯器認為,對於特定的型別,如果你對某一功能有更好地實現,那麼就該聽你的。模板分為類模板與函式模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體型別,偏特化就是模板如果有多個型別,那麼就只限定為其中的 一部分,其實特化細分為範圍上的偏特化與個數上的偏特化。模板的泛化 ...