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;
}
模板的全特化和偏特化都是在语句定义的模板基础之上,不能单独存在