【C++】模板之模板特化

一.模板特化概念與分類

1.模板特化概念

使用模板可以實現一些與類型無關的代碼,但對於一些特殊類型的可能會得到一些錯誤的結
果。就需要對模板進行特化。
即:在原模板類的基礎上,針對特殊類型所進行特殊化的實現方式。
2.模板特化分類

  • 類模板特化
  • 函數模板特化

二.函數模板特化(只能爲全特化)

  • 前情提要:一般不使用函數模板特化,直接用一般函數即可。
  • 特化步驟:
  1. 必須要先有一個基礎的函數模板
  2. 關鍵字template後面接一對空的尖括號<>
  3. 函數名後跟一對尖括號,尖括號中指定需要特化的類型
//函數模板
template<class T>
bool IsEqual(T& left, T& right) {
return left == right;
 }
 
 //函數模板特化
template<>
bool IsEqual<char*>(char*& left, char*& right) {
if(strcmp(left, right) > 0)
return true;
return false; 
}

//直接給出一般函數更好一些
bool IsEqual(char* left, char* right) {
if(strcmp(left, right) > 0)
return true;
return false; }

三.類模板特化

  • 全特化:將模板參數全部特化
//類模板
template<class T1, class T2>
class Data
{
public:
Data() {cout<<"Data<T1, T2>" <<endl;}
private:
T1 _d1;
T2 _d2;
};
//模板特化
template<>
class Data<int, char> {
public:
Data() {cout<<"Data<int, char>" <<endl;}
private:
T1 _d1;
T2 _d2;
};
  • 偏特化:任何針對模版參數進一步進行條件限制設計的特化版本。
    即將模板參數一部分特化/進一步限制
//部分特化
template <class T1>
class Data<T1, int> {
public:
Data() {cout<<"Data<T1, int>" <<endl;}
private:
T1 _d1;
int _d2;
};
//限制
//兩個參數偏特化爲指針類型  只能爲指針類型
template <typename T1, typename T2>
class Data <T1*, T2*>
{ 
public:
Data() {cout<<"Data<T1*, T2*>" <<endl;}
private:
T1 _d1;
T2 _d2;
};
//兩個參數偏特化爲引用類型  只能爲引用類型
template <typename T1, typename T2>
class Data <T1&, T2&>
{
public:
Data(const T1& d1, const T2& d2)
 : _d1(d1)
 , _d2(d2)
 {
cout<<"Data<T1&, T2&>" <<endl;
 }
private:
const T1 & _d1;
const T2 & _d2; 
 };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章