C++学习笔记36 (模板的细节明确template specialization)和显式实例(template instantiation)
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)的更多相关文章
- 【EF学习笔记08】----------加载关联表的数据 显式加载
显式加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 加载从表集合类型 //显示加载 Console.WriteLine("=========查询集合===========&quo ...
- OpenCV 学习笔记(模板匹配)
OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...
- Python Flask学习笔记之模板
Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...
- C++学习笔记36:类模板
类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...
- Angular 5.x 学习笔记(1) - 模板语法
Angular 5.x Template Syntax Learn Note Angular 5.x 模板语法学习笔记 标签(空格分隔): Angular Note on github.com 上手 ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...
- [原创]java WEB学习笔记36:Java Bean 概述,及在JSP 中的使用,原理
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- C++学习笔记之模板(1)——从函数重载到函数模板
一.函数重载 因为函数重载比较容易理解,并且非常有助于我们理解函数模板的意义,所以这里我们先来用一个经典的例子展示为什么要使用函数重载,这比读文字定义有效的多. 现在我们编写一个交换两个int变量值得 ...
随机推荐
- 【翻译】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 ...
- NYOJ 47 河问题
时间限制:1000 ms | 内存限制:65535 KB 难度:5 描写叙述 在漆黑的夜里,N位旅行者来到了一座狭窄并且没有护栏的桥边.假设不借助手电筒的话,大家是不管怎样也不敢过桥去的.不幸的是 ...
- OpenCV Haar AdaBoost源代码改进(比EMCV快6倍)
这几天研究了OpenCV源代码 Haar AdaBoost算法,作了一下改进 1.去掉了全部动态分配内存的操作.对嵌入式系统有一定的速度提升 2.凝视覆盖了大量关键代码 3.降低了代码一半的体积,而且 ...
- 前台技术--通过javaScript提交表单
window.location=pp+"?username="+getCookie("username")+"&userid="+g ...
- 边记边学PHP-(十五)MySQL数据库基础操作2
四.使用可视化工具创建数据库 尽管使用命令行感觉更像我们程序猿,可是我还是比較喜欢使用workbench来创建数据库. 首先打开workbench , 一个比較友好的界面就打开了,哈哈.我还是比較喜欢 ...
- 采用PopupWin控制消息推送功能
最近的项目需要,急需实现消息推送功能.接连试了很多办法,让我们用JavaScript为了实现啊,其效果是不咋好,最后,我发现了一个PopupWin这个,看着眼前的成绩不错,开始使用. 1.准备工作.先 ...
- .net机试题总结
1.下面是一个由*号组成的4行倒三角形图案.要求:1.输入倒三角形的行数,行数的取值3-21之间,对于非法的行数,要求抛出提示“非法行数!”:2.在屏幕上打印这个指定了行数的倒三角形. ******* ...
- 转: 第二章 IoC Annotation注入
http://blog.csdn.net/p_3er/article/details/9231307 1.命名空间 使用Annotation的方式,需要在spring的配置文件中配置命名空间.命名空间 ...
- 人人API 分享到人人功能 修改版
最近在搞一个日程管理网站, 需要实现分享到人人功能, 所以找了一下人人API, 然后根据自己需要修改了一下. 首先得有一个人人给的js文件, 如下: var Renren = Renren || {} ...
- 二叉查找树C语言实现
二叉查找树C语言实现 1. 二叉查找树的定义: 左子树不为空的时候,左子树的结点值小于根节点,右子树不为空时,右子树的结点值大于根节点,左右子树分别为二叉查找树 2. 二叉查找树的 ...