類的特化有什麼用?
- 有些資料是特殊形式的,特殊形式的資料在調用原模闆時候可能不相容,可以把它特殊化到一個單獨的類中去實作,針對這種獨立的資料類型去做處理
- 折疊參數的展開 采用特化的方式來展開
局部特化
//兩個未知類型的模闆類
template <class _Ty1,class _Ty2>
class MM
{
public:
MM(_Ty1 one, _Ty2 two) :one(one), two(two) {}
void print()
{
cout << one << " " << two << endl; //原來的資料列印方式 自定義類型需要重載
}
protected:
_Ty1 one;
_Ty2 two;
};
class Data
{
public:
Data(int a, int b) :a(a), b(b) {}
void print()
{
cout << a << " " << b << endl; //以自定義類型為參數調用不了模闆
}
protected:
int a;
int b;
};
//局部特化 特殊化 兩個未知類型特化成一個未知類型
template <class _Ty>
class MM<_Ty,_Ty> //特化産生的類 類名需要用: 類名<類型> 方式使用
{
public:
MM(_Ty one, _Ty two) :one(one), two(two) {}
void print()
{
//1.cout << one << " " << two << endl; //不采用統一的格式列印資料
//2.特化處理
one.print();
two.print(); //可以傳兩個類的對象類型進來 調用各自類對象的方法去列印資料
cout << "特殊化" << endl;
}
protected:
_Ty one;
_Ty two;
};
int main()
{
//調用原生模闆
MM<string, int> mm1("小芳", 18);
mm1.print();
//調用局部特化模闆
MM<string, string> mm2("小麗","小美");
mm2.print();
MM<Data, Data> dMM(Data(1,2),Data(3,4));
dMM.print(); //針對特殊的資料做特殊的處理
return 0;
}
/*輸出*/
小芳 18
小麗 小美
特殊化
1 2
3 4
特殊化
完全特化(相當于具體化)
template <class _Ty1,class _Ty2>
class MM
{
public:
MM(_Ty1 one, _Ty2 two) :one(one), two(two) {}
void print()
{
cout << one << " " << two << endl;
}
protected:
_Ty1 one;
_Ty2 two;
};
//完全特化
template <> //模闆類沒有未知類型 兩個未知類型都具體化
class MM<string, string> //需要傳入具體的類型 對 <string, string> 做單獨的處理
{
public:
MM(string one, string two) :one(one), two(two) {}
void print()
{
cout << "完全特化" << endl;
cout << one << " " << two << endl;
}
protected: //仍是一個模闆類 在構造這種類型的對象時會調用特化後的模闆
string one;
string two;
};
int main()
{
//調用完全特化的模闆---在折疊參數中有用
MM<string, string> mm2("小麗","小美");
mm2.print();
}
/*輸出*/
完全特化
小麗 小美