一.模板特化概念与分类
1.模板特化概念
使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结
果。就需要对模板进行特化。
即:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。
2.模板特化分类
- 类模板特化
- 函数模板特化
二.函数模板特化(只能为全特化)
- 前情提要:一般不使用函数模板特化,直接用一般函数即可。
- 特化步骤:
- 必须要先有一个基础的函数模板
- 关键字template后面接一对空的尖括号<>
- 函数名后跟一对尖括号,尖括号中指定需要特化的类型
//函数模板
template<class T>
bool IsEqual(T& left, T& right) {
return left == right;
}
//函数模板特化
template<>
bool IsEqual<char*>(char*& left, char*& right) {
if(strcmp(left, right) > 0)
return true;
return false;
}
//直接给出一般函数更好一些
bool IsEqual(char* left, char* right) {
if(strcmp(left, right) > 0)
return true;
return false; }
三.类模板特化
- 全特化:将模板参数全部特化
//类模板
template<class T1, class T2>
class Data
{
public:
Data() {cout<<"Data<T1, T2>" <<endl;}
private:
T1 _d1;
T2 _d2;
};
//模板特化
template<>
class Data<int, char> {
public:
Data() {cout<<"Data<int, char>" <<endl;}
private:
T1 _d1;
T2 _d2;
};
- 偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。
即将模板参数一部分特化/进一步限制
//部分特化
template <class T1>
class Data<T1, int> {
public:
Data() {cout<<"Data<T1, int>" <<endl;}
private:
T1 _d1;
int _d2;
};
//限制
//两个参数偏特化为指针类型 只能为指针类型
template <typename T1, typename T2>
class Data <T1*, T2*>
{
public:
Data() {cout<<"Data<T1*, T2*>" <<endl;}
private:
T1 _d1;
T2 _d2;
};
//两个参数偏特化为引用类型 只能为引用类型
template <typename T1, typename T2>
class Data <T1&, T2&>
{
public:
Data(const T1& d1, const T2& d2)
: _d1(d1)
, _d2(d2)
{
cout<<"Data<T1&, T2&>" <<endl;
}
private:
const T1 & _d1;
const T2 & _d2;
};