C++中模板的全特化与偏特化

C++全特化与偏特化

C++中用模板来实现代码的复用,模板分为类模板与函数模板,虽然模板引进到C++中的时间不长,可是却在很多方面有很多的应用,比如标准模板库STL中就有很多应用,然而当我们仔细的学习STL就会发现其中的模板充斥着很多的全特化与偏特化模板,那么什么是特化模板呢?
我们前面学习了模板知道了编译的时候编译器可以根据类型的不同实例化出不同的对象,可是如果有一个类型有更好的解决方案那么这个类型就可以不用这个模板,我们可以给这个类型设计一个新的解决方案,这种方式叫做特化。
特化分为全特化与偏特化,接下来我们先来看全特化

所有的特化都是在模板的基础上实现的。

全特化

全特化就是对所有模板参数进行特化,当适配到相应的类型的时候直接按照特化版执行。

#include<iostream>
#include<string>
#include<windows.h>
using namespace std;
template<class T>
class A
{
public:
 A()
 {
  cout << "这里走的原始版本" << endl;
 }
};
template<>
class A<int>
{
public:
 A()
 {
  cout << "这里走的int特化版本" << endl;
 }
};
int main()
{
 A<char> a;
 A<int> b;
 system("pause");
 return 0;
}

在上面这段代码中,第一个是对所有模板都适用的,第二个则是int的特化版本,那么当我们用其他类型进行实例化的时候会执行普通版本,当我们用int实例化的时候则会执行int特化版本

偏特化

#include<iostream>
#include<string>
#include<windows.h>
using namespace std;
 template<class T1,class T2>
 class A
 {
 public:
  A()
  {
   cout << "这个是普通版本" << endl;
  }
  T1 _a;
  T2 _b;
 };
 template<class T>
 class A<T,int>
 {
 public:
  A()
  {
   cout << "这个是偏特化版本" << endl;
  }
  T _a;
  int _b;
 };
int main()
{
 A<double, double> a;
 A<double, int> b;
 system("pause");
 return 0;
}

我们第二个参数给成int的话他会自己去执行偏特化版本,这里我们可以总结出偏特化与全特化的一个区别,全特化中所有的模板类型都给定才可以执行全特化版本,但是偏特化我们可以只给定有限的模板类型即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值