模板特化
有些时候,我们写的模板不能满足所有类型的使用,所有我们在使用一些特殊类型的时候,先要手动给出该类型模板的代码,这就是模板特化。
模板参数在某种特定类型下的具体实现称为模板的特化
特化分类
- 函数模板特化
- 类模板特化
函数模板特化
template<typename T>
T Max(T t1,T t2)
{
return (t1>t2)?t1:t2;
}
#define const char* p
template<>
p Max<p>(p t1,p t2)
{
return (strcmp(t1,t2)>0)?t1:t2;
}
函数特化的语法:
- template<>
- 函数返回值 函数名<特化类型>(函数参数列表)
如果遇到不能特化的类型,最好是将其函数原原本本的写出来,避免特化时出现问题。
类特化
template<class T1,class T2>
class Test_Template
{
public:
Test_Template()
{
cout<<_data1<<_data2;
}
private:
T1 _data1;
T2 _data2;
};
类特化分为两种:全特化、偏特化
- 全特化:模板参数列表中的所有参数都给出。
template<class T1,class T2>
class Test_Template
{
public:
Test_Template()
{
cout<<_data1<<_data2;
}
private:
T1 _data1;
T2 _data2;
};
//全特化
template<>
//具体给出每个模板参数的类型
class Test_Template<string,string>
{
public:
Test_Template()
{
cout<<_data1<<_data2;
}
private:
T1 _data1;
T2 _data2;
}
- 偏特化分类
- 部分偏特化(主要是参数个数)
- 范围偏特化(参数类型为指针、引用类型)
部分偏特化
特化参数的个数小于模板参数的个数
//部分偏特化
template<class T2> //没有给出具体类型的模板参数
class Test_Template<string,T2>
{
public:
Test_Template()
{
cout<<_data1<<_data2;
}
private:
T1 _data1;
T2 _data2;
}
范围偏特化
//范围偏特化,指针类型
template<class T1,class T2>
class Test_Template<T1*,T2*>
{
public:
Test_Template()
{
cout<<_data1<<_data2;
}
private:
T1 _data1;
T2 _data2;
}
template<class T1,class T2)
class Test_Template<T1&,T2&>
{
public:
Test_Template(const T1& d1,const T2& d2)
:_data1(d1)
,_data2(d2)
{
cout<<_data1<<_data2;
}
private:
T1& _data1;
T2& _data2;
}
int main()
{
Test_Template<string,string> t1;//全特化
Test_Template<string,char> t2;//部分偏特化
Test_Template<int&,int&> t3;//范围偏特化,引用版
}