一.模板特化概念與分類
1.模板特化概念
使用模板可以實現一些與類型無關的代碼,但對於一些特殊類型的可能會得到一些錯誤的結
果。就需要對模板進行特化。
即:在原模板類的基礎上,針對特殊類型所進行特殊化的實現方式。
2.模板特化分類
- 類模板特化
- 函數模板特化
二.函數模板特化(只能爲全特化)
- 前情提要:一般不使用函數模板特化,直接用一般函數即可。
- 特化步驟:
- 必須要先有一個基礎的函數模板
- 關鍵字template後面接一對空的尖括號<>
- 函數名後跟一對尖括號,尖括號中指定需要特化的類型
//函數模板
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;
};