模板的偏特化,全特化

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;
}

模板的全特化和偏特化都是在语句定义的模板基础之上,不能单独存在 

猜你喜欢

转载自blog.csdn.net/audience_fzn/article/details/81512337