【C++】模板之模板特化

一.模板特化概念与分类

1.模板特化概念

使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结
果。就需要对模板进行特化。
即:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。
2.模板特化分类

  • 类模板特化
  • 函数模板特化

二.函数模板特化(只能为全特化)

  • 前情提要:一般不使用函数模板特化,直接用一般函数即可。
  • 特化步骤:
  1. 必须要先有一个基础的函数模板
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
//函数模板
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; 
 };
发布了53 篇原创文章 · 获赞 49 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43550839/article/details/103107078