模板与泛型编程

--模板特化[续]

三、特化成员而不特化类

除了特化整个模板之外,还能够仅仅特化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. 最核心4大NFC技术规范详解

    1998年,飞利浦.索尼和诺基亚创建了 NFC论坛,宗旨是推动NFC的发展普及和规范化.论坛至今共推出了5大类技术规范:协议技术规范(Protocol Technical Specification) ...

  2. QT下的几种透明效果(三种方法:调色板,透明度属性,自绘)

    1.窗口整体透明,但是窗体上的控件不透明.    通过设置窗体的背景色来实现,将背景色设置为全透.  QPalette pal = palette();  pal.setColor(QPalette: ...

  3. Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等

    继续并发专题~ FutureTask 有点类似Runnable,都可以通过Thread来启动,不过FutureTask可以返回执行完毕的数据,并且FutureTask的get方法支持阻塞. 由于:Fu ...

  4. [转]JSOM绘制地图区块及航道路径

    From :http://support.sailstech.com/kb/c73fd2405d79911253e568ccdc69256dc7c8fb5c/josm 步驟一: 使用JOSM繪製地圖區 ...

  5. Eclipse 安装mybatis的编辑插件

    1.MyEditor安装的方式 Eclipse 安装mybatis的编辑插件有以下4种方式,您可以使用下列方法之一来安装MyBatis的编辑器: Eclipse 3.7的(市场客户机安装):此图像拖放 ...

  6. stl入门--reverse函数

    #include<iostream> #include<algorithm>          using namespace std; int main() {     ch ...

  7. relay 2015-02-05 21:00 27人阅读 评论(0) 收藏

    scanf函数是以在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔. C编译在碰到空格,TAB,回车或非法数据(如对"%d"输 ...

  8. bzoj 维护序列seq(双标记线段树)

    Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 4184  Solved: 1518[Submit][Status][Discus ...

  9. Redis 实践笔记

    本文来自:http://www.cnblogs.com/me-sa/archive/2012/03/13/redis-in-action.html 最近在项目中实践了一下Redis,过程中遇到并解决了 ...

  10. sqlplus中隐患组合键

    在UNIX/Linux平台中的SQL*Plus命令行提示符下,如果误按了组合键:Ctrl+S,那么这个会话将被锁定,输入任何命令都没有显示出来的. 解锁组合键:Ctrl+Q 注意:在使用ctrl+s锁 ...