1. 程式人生 > >c++中模板的特化

c++中模板的特化

關於模板的特化

關於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*>{
}

在呼叫時都將呼叫與自己的型別最相匹配的。