我们先来定义一个普通的模板类

1 template<class T>
2 struct Test
3 {
4     Test(){ cout << "模板类" << endl; }
5 };

我们再来调用一下:

1 int main()
2 {
3     Test<char> t1;
4     Test<int> t2;
5     Test<int *> t3;
6     return 0;
7 }

输出的结果1:

  模板类

  模板类

  模板类

如果我们这样写,再增加一个模板类

 1 template<class T>
 2 struct Test
 3 {
 4     Test(){ cout << "模板类" << endl; }
 5 };
 6
 7 template<>
 8 struct Test<int>
 9 {
10     Test(){ cout << "全特化" << endl; }
11 };

再来调用一下,调用代码同上!

输出的结果2:

  模板类

  全特化

  模板类

其中template<>开头的模板类就是全特化的模板类,根据全特化模板的定义就知道,全特化的时候没有类型参数,即template<(这里是空)>。由于全特化版本的模板类与Test<int> t2;调用时更接近,所以会用这个模板来实例化一个类。

那什么是偏特化模板类,先看如下定义:

 1 template<class T>
 2 struct Test
 3 {
 4     Test(){ cout << "模板类" << endl; }
 5 };
 6
 7 template<>
 8 struct Test<int>
 9 {
10     Test(){ cout << "全特化" << endl; }
11 };
12
13 template<class T>
14 struct Test<T*>
15 {
16     Test(){ cout << "偏特化" << endl;}
17 };

再次调用,输出结果3:

  模板类
  全特化
  偏特化 

我们看一下,第三个模板类的定义,会发现它很特别,它既有类型参数。但又需要对其进行特化(这里是特化成指针类型),当你给的是指针类型的时候,会调用这个模板,而不是普通模板。这就是部分特化,也称偏特化。有的人可能会想到,我这样写不也行么:

template<class T*>
struct Test
{Test(){ cout << "型别是指针!" << endl;}
};

对不起,这段代码可以通过编译,但是在你实例化一个类的时候,即Test<int *> t;的时候就编译不同过了!所以必须要用到偏特化!当然,我上面写的是偏特化的一种,当这样的时候也是偏特化:

template<class T>
struct Test<int,T>
{
}

这个偏特化的例子中,一个参数被绑定到int类型,而另一个参数仍未绑定需要由用户指定。这也是偏特化。而且更好理解!还有一点要注意的是,我们在写全特化类模板和偏特化类模板的时候,都必须给出一个普通类模板的定义,如果不定义普通模板而只定义全特化模板或者偏特化模板编译时会报错:对不起,XXX不是一个模板!

转载于:https://www.cnblogs.com/zhuwbox/p/3694860.html

模板类的全特化、偏特化相关推荐

  1. [C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

    http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html 1.  主版本模板类 首先我们来看一段初学者都能看 ...

  2. 模板 泛化 全特化 偏特化

    template<>出现,就表示要特化了 为什么要特化呢?泛化不就是为了解决数据类型不一致吗? 泛化是通用,特化是优化,缺一不可 特化,又被成为全特化 full-specializatio ...

  3. 操作符重载and模板(泛化, 全特化, 偏特化)

    模板 Header(头文件)中的防卫式声明.布局 // complex.h// guard 防卫式声明 #ifndef __COMPLEX__ #define __COMPLEX__// 0.forw ...

  4. (函数/类模板)的(偏特化/全特化)

    特化的概念 特化,就是将泛型的东东搞得"具体化"一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰或完全被指定了下 ...

  5. Th4.6:模板全特化、偏特化(局部特化)详述

    本小节回顾的知识点分别是模板全特化.偏特化(局部特化). 今天总结的知识分为以下4个大点: (1)特化与泛化 (2)类模板特化     (2.1)类模板全特化         a)常规全特化      ...

  6. C++ 模板 全特化与偏特化

    C++ 模板 全特化与偏特化 模板 模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性.模版可以分为两类,一个是函数模版,另外一个是 ...

  7. C++模板的全特化和偏特化

    C++模板的全特化与偏特化 全特化 偏特化 例子 总结 全特化 全特化一般用于处理有特殊要求的类或者函数,此时依靠泛型模板无法处理这种情况.,因此全特化可以运用在类模板和函数模板当中.其模板参数列表为 ...

  8. 【C++模板】类模板的全部特例化和局部特例化(偏特化-partial specialization)

    前言 本专栏所有的文章都需要一定的基础知识.在文中对于基础的概念将会一带而过,或者在其他文章有讲,会贴出对应的链接而不再进行赘述. 目录 前言 类模板的Stack实现 类模板的全部特例化(偏特化) 写 ...

  9. C++ 模板偏特化-来自STL的思考

    之前学习STL时接触过一段时间的模板,模板是C++泛型编程编程的基础 STL从头到尾都是模板泛型编程,我觉得用的最巧妙的就是在traits萃取技巧时用到的模板偏特化 先简要回顾一下模板吧,模板主要分为 ...

最新文章

  1. 云网融合 — 基于 SD-DCI 的云间网络融合
  2. GitHub 5W 星:一行命令下载全网视频的两个开源项目
  3. redis单主机多实例
  4. 佳能2020转印带拆卸图解_RF人文街拍小钢炮 佳能RF35mm F1.8 MACRO IS STM
  5. ef mysql 外键 一对一_MySQL 外键 一对一 一对多 多对多 复制
  6. Ubuntu的奇技淫巧
  7. GPS定位冷启动和热启动的区别
  8. JQuery获取当前屏幕的高度宽度
  9. 如何在java输入_怎么在java中编写输入语句?
  10. oracle跳出while循环,【shell编程】for循环、while循环、break跳出循环、continue结束本次循环和exit退出整个脚本...
  11. Axure RP 8 注册码
  12. [Python]正相匹配中文分词【哈工大 车万翔老师视频公开课】
  13. 【扯淡篇】CTSC/APIO/SDOI R2时在干什么?有没有空?可以来做分母吗?
  14. php验证电子邮箱格式正确,php判断电子邮件是否正确方法
  15. EasyExcel注解方式校验数据行
  16. 微信小程序的wx:for和vue的v-for
  17. 维生素C - 坏血症
  18. 自然语言处理的通俗百科
  19. MySQL数据库的创建(表的创建,列,表的增删改,深入浅出)
  20. 国内阿米巴经营落地的三大难点

热门文章

  1. python自定义变量名_Python 动态变量名定义与调用
  2. 【php内核与扩展开发系列】PHP生命周期---启动、终止与模式
  3. JavaWeb基础学习笔记
  4. Vue学习小案例--分页组件封装
  5. 自定义LeNet5,开启你的炼丹之路
  6. 基于Spark的Als算法+自迭代+Spark2.0新写法
  7. ES-Hadoop学习之ES和HDFS数据交换
  8. PowerShell在Exchange2010下交互式修改群组审批人和免审批邮箱
  9. CentOS 7下搭建LAMP并把MySQL单独分离
  10. 竞价账户烧钱的七大病因和处理办法