天天看點

c++模闆 --- 類模闆特化

  • 一個模闆類可以衍變成多個模闆
  • 局部特化
  • 完全特化

類的特化有什麼用?

  • 有些資料是特殊形式的,特殊形式的資料在調用原模闆時候可能不相容,可以把它特殊化到一個單獨的類中去實作,針對這種獨立的資料類型去做處理
  • 折疊參數的展開 采用特化的方式來展開

局部特化

//兩個未知類型的模闆類
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();
}

/*輸出*/

完全特化
小麗 小美
           

繼續閱讀