C++ Primer 学习笔记_85_模板与泛型编程 --模板特化[续]
模板与泛型编程
--模板特化[续]
三、特化成员而不特化类
除了特化整个模板之外,还能够仅仅特化push和pop成员。我们将特化push成员以复制字符数组,而且特化pop成员以释放该副本使用的内存:
- template<>
- void Queue<const char *>::push(const char *const &val)
- {
- char *new_item = new char[sizeof(val) + 1];
- strncpy(new_item,val,sizeof(val)+1);
- QueueItem<const char *> *pt = new QueueItem<const char *>(new_item);
- if(empty())
- {
- head = tail = pt;
- }
- else
- {
- tail -> next = pt;
- tail = pt;
- }
- }
- template<>
- void Queue<const char *>::pop()
- {
- QueueItem<const char *> *p = head;
- delete head -> item;
- head = head -> next;
- delete p;
- }
类类型Queue<constchar*> 将从通用类模板定义实例化而来,而push和pop函数例外。调用Queue<constchar*> 对象的push或 pop函数时,将调用特化版本号;调用随意其它成员时,将从类模板为constchar* 实例化一个通用版本号。
特化声明
成员特化的声明与其它函数模板特化一样,必须以空的模板形參表开头:
- template <>
- void Queue<const char *>::push(const char *const &);
- template <>
- void Queue<const char *>::pop();
这些声明应放在Queue类的头文件中。
四、类模板的部分特化
假设类模板有一个以上的模板形參,我们或许想要特化某些模板形參而非所有。使用类模板的部分特化能够实现这一点:
- template <class T1,class T2>
- class some_templates
- {
- //...
- };
- template <class T1>
- class some_templates<T1,int>
- {
- //...
- };
类模板的部分特化本身也是模板。部分特化的定义看来像模板定义,这样的定义以keywordtemplate开头,接着是由尖括号(<>)括住的模板形參表。部分特化的模板形參表是相应的类模板定义形參表的子集。some_template的部分特化仅仅有一个名为T1的模板类型形參,第二个模板形參T2的实參已知为int。部分特化的模板形參表仅仅列出未知模板实參的那些形參。
使用类模板的部分特化
类模板的名字后面必须接着模板实參列表,前面样例中,模板实參列表是<T1,int>。由于第一个模板形參的实參值未知,实參列表使用模板形參名T1作为占位符,还有一个实參是类型int,为int而部分特化模板。
像不论什么其它类模板一样,部分特化是在程序中使用时隐式实例化:
- some_templates<int,string> foo; //使用泛型版本号
- some_templates<string,int> bar; //使用特化版本号
注意第二个变量的类型,形參为string和 int的some_template,既能够从普通类模板定义实例化,也能够从部分特化实例化。为什么选择部分特化来实例化该模板呢?当声明了部分特化的时候,编译器将为实例化选择最特化的模板定义,当没有部分特化能够使用的时候,就使用通用模板定义。foo的实例化类型与提供的部分特化不匹配,因此,foo的类型必定从通用类模板实例化。部分特化仅仅用于实例化第二个类型为int的some_template类型。
部分特化的定义与通用模板的定义全然不会冲突。部分特化能够具有与通用类模板全然不同的成员集合。类模板成员的通用定义永远不会用来实例化类模板部分特化的成员。
C++ Primer 学习笔记_85_模板与泛型编程 --模板特化[续]的更多相关文章
- C++ Primer 学习笔记_5_变量和基本类型(续2)
变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: enum {input, output, a ...
- C++ Primer 学习笔记_76_模板与泛型编程 --模板定义[续]
模板与泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...
- C++ Primer 学习笔记_84_模板与泛型编程 --模板特化
模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一 ...
- C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...
- C++ Primer 学习笔记_76_模板和泛型编程 --模板定义[继续]
模板和泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...
- C++ Primer 学习笔记_79_模板与泛型编程 --模板编译模型
模板与泛型编程 --模板编译模型 引言: 当编译器看到模板定义的时候,它不马上产生代码.仅仅有在用到模板时,假设调用了函数模板或定义了模板的对象的时候,编译器才产生特定类型的模板实例. 一般而言,当调 ...
- C++ Primer学习笔记(三) C++中函数是一种类型!!!
C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...
- C++ Primer学习笔记(二)
题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接 C++ Primer学习笔记(一) 27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...
- C++ Primer 学习笔记_77_模板与泛型编程 --实例化
模板与泛型编程 --实例化 引言: 模板是一个蓝图,它本身不是类或函数.编译器使用模板产生指定的类或函数的特定版本号.产生模板的特定类型实例的过程称为实例化. 模板在使用时将进行实例化,类模板在引用实 ...
随机推荐
- Elf 32
[CentOS]安装软件:/ld-linux.so.2: ELF interpreter解决 环境: [orangle@localhost Downloads]$ uname -m&&am ...
- delphi 修改代码补全的快捷键(由Ctrl+Space 改为 Ctrl + alt + Space)(通过修改OpenTool生效)
delphi 的IDE快捷键与输入法切换键中突,以往的解决方法是下载一个ImeTool修改 windows 系统的快捷键 在 xp win7 都好使,但在win 10经常是修改完后,重启又失效了. 本 ...
- Android工程师面试准备知识点
听+7哥说,把下面的全弄懂,面试必过,所以我就试着去把所有题目补充了一下,各位能耐的网友们,如果有吐槽或者补充的尽管给我留言,在这里谢过大家了. 1. android的多线程如何通信 答:Andr ...
- hdu 5607 graph (矩阵乘法快速幂)
考虑一个经典的问题: 询问从某个点出发,走 k 步到达其它各点的方案数? 这个问题可以转化为矩阵相乘,所以矩阵快速幂即可解决. 本题思路: 矩阵经典问题:求从i点走k步后到达j点的方案数(mod p) ...
- android 实现自己定义状态栏通知(Status Notification)
在android项目的开发中,有时为了实现和用户更好的交互,在通知栏这一小小的旮旯里,我们通常须要将内容丰富起来,这个时候我们就须要去实现自己定义的通知栏,比如以下360或者网易的样式: 首先我们要了 ...
- C# 设计模式 - 单例模式 演示
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C# MySQL数据库的备份 还原 初始化
// 执行创建数据库操作 this.GetExecute(G_Con, "create database if not exists NEWDB"); this.sqlAddres ...
- 关于HTML css的一些题目
1.dcutype是什么,他是干嘛用的 doctype是文档的一种声明,告诉浏览器器用什么规则来解析文档. 2.ul ol dl分别适用于什么地方? ul无序列表 ol有序列表 dl是定义列表,会默认 ...
- MRP工作台任务下达之x组织屏蔽全部发放功能
应用 Oracle Manufacturing Planning 层 Level Function 函数名 Funcgtion Name MRPFPPWB-390 表单名 Form Name MR ...
- 在.NET中使用iTextSharp创建/读取PDF报告: Part I [翻译]
原文地址:Create/Read Advance PDF Report using iTextSharp in C# .NET: Part I By Debopam Pal, 27 Nov 20 ...