C++有时模板很可能无法处理某些类型的。

例如:

#include <iostream>
using namespace std;
class man{
private:
string name;
int data;
public:
man(string s,int i):name(s),data(i){
}
void show()const{
cout<<"this name is "<<name<<" ,data="<<data<<endl;
}
};
template <class T>
void mSwap(T t1,T t2){
T temp=t1;
t1=t2;
t2=temp;
cout<<"Here are template version "<<t1<<" and "<<t2<<" swap successed!"<<endl; };
int main()
{
mSwap(88,66);
man m1("guang",99);
man m2("jing",10);
mSwap(m1,m2);
}

编译结果:



能够看到会出现非常多错误。(尽管这不是重点。

如果我希望mSwap仅仅是交换两个man的data,而name还保持与原来一样。

该怎么做呢?

这个时候,就须要我们为特定的类型提供详细化的模版定义了。

详细化包含显式详细化以及隐式实例化和显式实例化。

1.显式详细化的原型和定义应以template<>开头。并通过名称来指出类型。

template<>
void mSwap(man &m1,man &m2)

或者

template<>
void mSwap<man>(man &m1,man &m2)

改动后的样例:

#include <iostream>
using namespace std;
class man{
private:
string name;
int data;
public:
man(string s,int i):name(s),data(i){
}
void show()const{
cout<<"this name is "<<name<<" ,data="<<data<<endl;
}
void setData(int d){
data=d;
}
int getData()const{
return data;
}
};
template <class T>
void mSwap(T &t1,T &t2){
T temp=t1;
t1=t2;
t2=temp;
cout<<"Here are template version "<<t1<<" and "<<t2<<" swap successed!"<<endl; };
template<>
void mSwap(man &m1,man &m2){
int temp=m1.getData();
m1.setData(m2.getData());
m2.setData(temp);
cout<<"Here are the man version,successed!"<<endl;
}
int main()
{
int i=88,j=66;
mSwap(i,j);
man m1("guang",99);
man m2("jing",10);
mSwap(m1,m2);
m1.show();
m2.show();
}

执行截图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

这就是模版显式详细化的作用了。

须要注意的是,详细化优先于常规模版,而非模版函数优先于详细化和常规模版。

2.实例化

要进一步了解模版,必须理解术语实例化和详细化。

记住,在代码中包括函数模版本号身并不会生成函数定义,它仅仅是一个用于生成函数定义的方案。编译器使用模版为特定类型生成函数定义时。得到的是模版实例。比如,上面的mSwap(i,j),函数调用mSwap(i,j)导致编译器生成mSwap()的一个实例,该实例使用int类型。

模版并不是是函数定义,但使用int的模版实例是函数定义。这样的实例化方式被称为隐式实例化。

C++还能够显式实例化。

语法为,声明所需的种类--用<>符号指示类型,并在声明之前加上keywordtemplate:

templata void mSwap<man>(man &,man &)

该声明的意思是“使用mSwap()模版生成man类型的函数定义”。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

C++学习笔记36 (模板的细节明确template specialization)和显式实例(template instantiation)的更多相关文章

  1. 【EF学习笔记08】----------加载关联表的数据 显式加载

    显式加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 加载从表集合类型 //显示加载 Console.WriteLine("=========查询集合===========&quo ...

  2. OpenCV 学习笔记(模板匹配)

    OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...

  3. Python Flask学习笔记之模板

    Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...

  4. C++学习笔记36:类模板

    类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...

  5. Angular 5.x 学习笔记(1) - 模板语法

    Angular 5.x Template Syntax Learn Note Angular 5.x 模板语法学习笔记 标签(空格分隔): Angular Note on github.com 上手 ...

  6. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

  7. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  8. [原创]java WEB学习笔记36:Java Bean 概述,及在JSP 中的使用,原理

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. C++学习笔记之模板(1)——从函数重载到函数模板

    一.函数重载 因为函数重载比较容易理解,并且非常有助于我们理解函数模板的意义,所以这里我们先来用一个经典的例子展示为什么要使用函数重载,这比读文字定义有效的多. 现在我们编写一个交换两个int变量值得 ...

随机推荐

  1. 【翻译】Why JavaScript Is and Will Continue to Be the First Choice of Programmers

    花费2半小时,那么最终会被翻译.假设有问题,请提出,毕竟,自己的6不超过级别. 附加链接 Why JavaScript Is and Will Continue to Be the First Cho ...

  2. NYOJ 47 河问题

    时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描写叙述 在漆黑的夜里,N位旅行者来到了一座狭窄并且没有护栏的桥边.假设不借助手电筒的话,大家是不管怎样也不敢过桥去的.不幸的是 ...

  3. OpenCV Haar AdaBoost源代码改进(比EMCV快6倍)

    这几天研究了OpenCV源代码 Haar AdaBoost算法,作了一下改进 1.去掉了全部动态分配内存的操作.对嵌入式系统有一定的速度提升 2.凝视覆盖了大量关键代码 3.降低了代码一半的体积,而且 ...

  4. 前台技术--通过javaScript提交表单

    window.location=pp+"?username="+getCookie("username")+"&userid="+g ...

  5. 边记边学PHP-(十五)MySQL数据库基础操作2

    四.使用可视化工具创建数据库 尽管使用命令行感觉更像我们程序猿,可是我还是比較喜欢使用workbench来创建数据库. 首先打开workbench , 一个比較友好的界面就打开了,哈哈.我还是比較喜欢 ...

  6. 采用PopupWin控制消息推送功能

    最近的项目需要,急需实现消息推送功能.接连试了很多办法,让我们用JavaScript为了实现啊,其效果是不咋好,最后,我发现了一个PopupWin这个,看着眼前的成绩不错,开始使用. 1.准备工作.先 ...

  7. .net机试题总结

    1.下面是一个由*号组成的4行倒三角形图案.要求:1.输入倒三角形的行数,行数的取值3-21之间,对于非法的行数,要求抛出提示“非法行数!”:2.在屏幕上打印这个指定了行数的倒三角形. ******* ...

  8. 转: 第二章 IoC Annotation注入

    http://blog.csdn.net/p_3er/article/details/9231307 1.命名空间 使用Annotation的方式,需要在spring的配置文件中配置命名空间.命名空间 ...

  9. 人人API 分享到人人功能 修改版

    最近在搞一个日程管理网站, 需要实现分享到人人功能, 所以找了一下人人API, 然后根据自己需要修改了一下. 首先得有一个人人给的js文件, 如下: var Renren = Renren || {} ...

  10. 二叉查找树C语言实现

    二叉查找树C语言实现 1.      二叉查找树的定义: 左子树不为空的时候,左子树的结点值小于根节点,右子树不为空时,右子树的结点值大于根节点,左右子树分别为二叉查找树 2.      二叉查找树的 ...