c++中模板的特化
阿新 • • 發佈:2019-01-13
關於模板的特化
關於c++函式的模板
函式的特化
使用模板時會遇到一些特殊的型別需要特殊處理,不能直接使用當前的模板函式,所以此時我們就需要對該型別特化出一個模板函式(就是寫出一個模板函式專門給該型別使用)
當使用一個判斷相等的模板函式時
template<class T>
bool Isequal(T& p1, T& p2){
return p1 == p2;
}
但是該模板函式在對於字串進行比較時就不能使用了,對於字串我們不能直接比較,因此直接特化出一個專門供字串使用的模板引數
template<> // 此處不新增型別模板,直接使用空即可 bool Isequal<char*>(char*& p1, char*& p2){ return strcmp(p1, p2) == 0; }
【注意】
-
使用模板特化時,必須要先有基礎的模板函式(就是上面第一個模板函式)
-
使用特換模板函式時格式有要求:
1.template 後直接跟<> 裡面不用寫型別
2.函式名<特化型別>(特化型別 引數1, 特化型別 引數2 , …) 在函式名後跟<>其中寫要特化的型別 -
特化的函式的函式名,引數列表要和原基礎的模板函式想相同,避免不必要的錯誤
在實際使用中,為了實現簡單,對於一些模板函式處理有問題的特殊型別,我們將其直接寫出
bool Isequal(char*& p1, char*& p2){ cout << "char2" << endl; return strcmp(p1, p2) == 0; }
- 當有可以直接匹配的函式時,即使有特化出的函式,都優先使用直接匹配的函式
類的模板特化
類的模板特化分為兩種,一種是全特化,一種為偏特化
- 全特化: 即將所有的模板型別都進行特化
template <class T1, class T2>
class Test{
}
//全特化
template <> //此處同函式模板的特化一樣不用寫內容
class Test<int , char>{
}
- 偏特化:對於模板的型別做一些限制
- 偏特化份為兩種 一種是部分特化,一種是對於模板型別的進一步限制
- 部分特化:就是隻對函式模板的一部分模板型別進行特化
template <class T1, class T2>
class Test2{
}
//部分特化
template <class T1> //此處只需寫未進行特化的模板型別,特化過的就不用寫
class Test2<T1 , char>{
}
- 對型別的範圍的限制,主要的型別基礎不變
template <class T1, class T2>
class Test2{
}
//對模板型別的範圍做出一定的限制
template <class T1 , class T2 > //此處只需寫未進行特化的模板型別
class Test2<T1* , T2*>{
}
在呼叫時都將呼叫與自己的型別最相匹配的。