模板与泛型编程

--模板特化[续]

三、特化成员而不特化类

除了特化整个模板之外,还能够仅仅特化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_模板与泛型编程 --模板特化[续]的更多相关文章

  1. C++ Primer 学习笔记_5_变量和基本类型(续2)

     变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: enum {input, output, a ...

  2. C++ Primer 学习笔记_76_模板与泛型编程 --模板定义[续]

    模板与泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...

  3. C++ Primer 学习笔记_84_模板与泛型编程 --模板特化

    模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一 ...

  4. C++ Primer 学习笔记_75_模板与泛型编程 --模板定义

    模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...

  5. C++ Primer 学习笔记_76_模板和泛型编程 --模板定义[继续]

    模板和泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...

  6. C++ Primer 学习笔记_79_模板与泛型编程 --模板编译模型

    模板与泛型编程 --模板编译模型 引言: 当编译器看到模板定义的时候,它不马上产生代码.仅仅有在用到模板时,假设调用了函数模板或定义了模板的对象的时候,编译器才产生特定类型的模板实例. 一般而言,当调 ...

  7. C++ Primer学习笔记(三) C++中函数是一种类型!!!

    C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...

  8. C++ Primer学习笔记(二)

    题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接  C++ Primer学习笔记(一)   27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...

  9. C++ Primer 学习笔记_77_模板与泛型编程 --实例化

    模板与泛型编程 --实例化 引言: 模板是一个蓝图,它本身不是类或函数.编译器使用模板产生指定的类或函数的特定版本号.产生模板的特定类型实例的过程称为实例化. 模板在使用时将进行实例化,类模板在引用实 ...

随机推荐

  1. activity 的返回按钮

    http://www.2cto.com/kf/201210/160251.html 连续点击两次程序就退出程序,这是一个很有趣的程序功能,下来介绍一下我的实现方式(欢迎大家拍砖指点):   1.在Ac ...

  2. javascript 事件设计模式

    http://plkong.iteye.com/blog/213543 1. 事件设计概述 事件机制可以是程序逻辑更加清晰可见,在JavaScript中很多对象都有自己的事件,如:button有onc ...

  3. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

  4. 【LeetCode练习题】Reverse Linked List II

    Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass. F ...

  5. apache端口被占用

      1.80端口被占用,先去服务里将IIS关闭掉,然后重启apache,如果还是继续弹窗the requested operation has failed...需要去Internet信息服务里面停止 ...

  6. Eclipse中更改默认java代码格式【转】

    在写代码时常常有2种代码样式习惯,如下图.由于一直习惯了第一种代码格式,而看第二种代码格式时感觉代码很乱,总找不到“{ }”对称的感觉.Eclipse自动格式化代码的快捷方式是Ctrl+Shift+F ...

  7. 常用Java Web 服务器

    Java Web应用程序需要部署在Java web服务器中运行,常用的Java Web服务器有Tomcat.GlassFish.WebLogic.JBoss.WebSphere.Jetty.JRun等 ...

  8. JS(移动端)自己封装移动端一些常用方法

    /** * Created by Administrator on 2016/7/14. */ /*命名空间*/ window.lcf = {}; /*监听过渡结束的方法*/ lcf.transiti ...

  9. 关于rem自适应的一点研究

    参考地址:http://m.ctrip.com/html5/ https://www.amazon.cn/ rem是相对于html根元素的一个单位.rem是px的16倍,即1rem = 16px;除了 ...

  10. RDLC报表系列(四) 矩阵

    继续接上一篇的内容,本文主要是讲矩阵的内容 用到的数据源如下: DataTable dt = new DataTable(); dt.Columns.Add("FiscalYear" ...