模板的偏特化,全特化

audience_fzn發表於2018-08-08

c++中的模板分為類别範本和函式模板

模板的特化分為倆種:全特化和偏特化

全特化:

舉一個簡單的例子

template<class T>
class AA
{
public:
	AA()
		:_a(0)
	{}
	~AA()
	{
		cout << "原始模板" << endl;
	}
protected:
	T _a;
};

template<>
class AA<int>
{
public:
	AA()
		:_a(0)
	{}
	~AA()
	{
		cout << "全特化後的int版本" << endl;
	}
protected:
	int _a;
};

void test()
{
	AA<char> a;
	AA<int> b;
}

 

 可以發現,A<int> b呼叫的是我們全特化後的版本,而A<char> a呼叫的是原始版本。

 

偏特化:

偏特化又稱為區域性特化,全特化是對所有的模板引數進行特化,偏特化是對區域性的引數特化

一個簡單的例子:

template<class T1,class T2>
class Data
{
public:
	Data();
protected:
	T1 _d1;
	T2 _d2;
};

template<class T1,class T2>
Data<T1, T2>::Data()
{
	cout << "Data<T1,T2>" << endl;
}
//區域性特化第二個引數
template<class T1>
class Data<T1,int>
{
public:
	Data();
protected:
	T1 _d1;
	int _d2;
};
template<class T1>
Data<T1, int>::Data()
{
	cout << "Data<T1,int>" << endl;
}
void test1()
{
	Data<double,int> d1;
	Data<int,double> d2;
}

當我們在例項化物件的時候,如果定義的型別剛好符合區域性特化的型別,那麼就直接呼叫區域性特化版本的模板類 

偏特化並不是僅僅指對特定的部分引數進行限制,而是針對模板引數更進一步的條件限制所設計出來的一個特化版本。通過下述例子可以看出:

//區域性特化倆個引數為指標型別
template<class T1,class T2>
class Data<T1*, T2*>
{
public:
	Data();
private:
	T1 _d1;
	T2 _d2;
	T1* _d3;
	T2* _d4;
};
template<class T1,class T2>
Data<T1*, T2*>::Data()
{
	cout << "Data<T1*,T2*>"<< endl;
}
//區域性特化倆個引數為引用型別
template<class T1, class T2>
class Data<T1&, T2&>
{
public:
	Data(const T1& d1,const T2& d2);
private:
	const T1& _d1;
	const T2& _d2;
	T1* _d3;
	T2* _d4;
};
template<class T1, class T2>
Data<T1&, T2&>::Data(const T1& d1, const T2& d2)
		:_d1(d1)
		, _d2(d2)
{
	cout << "Data<T1&,T2&>" << endl;
}

 

模板的全特化和偏特化都是在語句定義的模板基礎之上,不能單獨存在 

 

 

 

相關文章