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变量值得 ...
随机推荐
- Qt之QComboBox(基本应用、代理设置)
QComboBox下来列表比较常用,用户可以通过选择不同的选项来实现不同的操作,如何实现自己的下拉列表呢? 很多人在问QComboBox如何设置选项的高度.代理等一些问题!今天就在此分享一下自己的一些 ...
- ECSHOP如何增加红包序列号字符
ECSHOP系统线下发放红包时系统生成的红包序列号是在10000的基础上增加四位随机数字.如果当我们要发放大额度红包的时候,这样的序列号规 则难免给人不安全的感觉,万一有无聊的人,蒙几个红包序列号出来 ...
- 初探Java8中的HashMap(转)
HashMap是我们最常用的集合之一,同时Java8也提升了HashMap的性能.本着学习的原则,在这探讨一下HashMap. 原理 简单讲解下HashMap的原理:HashMap基于Hash算法,我 ...
- ZOJ 3795 Grouping 求最长链序列露点拓扑
意甲冠军:特定n积分.m向边条. 该点被划分成多个集合随机的每个集合,使得2问题的关键是无法访问(集合只能容纳一个点) 问至少需要被分成几个集合. 假设没有戒指,接着这个话题正在寻求产业链最长的一个有 ...
- HTML5 RPG游戏引擎 地图实现篇
一,话说全国年夜事 前没有暂看到lufy的专客上,有一名伴侣念要一个RPG游戏引擎,出于兴趣筹办入手做一做.因为我研讨lufylegend有冶时间了,对它有必然的依赖性,因而便筹办将那个引擎基于 ...
- 基础知识(1)- Java程序设计概述
1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1 简单性 1.2.2 面向对象 1.2.3 网络技能 1.2.4 健壮性 1.2.5 安全性 1.2.6 体系 ...
- HDU4870:Rating(DP)
Problem Description A little girl loves programming competition very much. Recently, she has found a ...
- C# Windows Phone 8 WP8,切换各国语系免重开机 加速开发 送审有效率!!
原文:C# Windows Phone 8 WP8,切换各国语系免重开机 加速开发 送审有效率!! 一般我们在开发Windows Phone 8 时,会考虑到各国语言的问题,但是你有想过吗?用实体手机 ...
- doc-remote-debugging.html
https://studio.zerobrane.com/doc-remote-debugging.html
- C++习题 复数类--重载运算符2+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...