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. 赤裸裸的splay平衡树

    HYSBZ1588 http://www.lydsy.com/JudgeOnline/problem.php?id=1588 给我们n天的营业额, 要求出每天的最小波动值,然后加起来.  当天最小波动 ...

  2. Steps UVA 846

    说说:此题要求求出从整数x到达整数y所要经过的最短步数,且第一步和最后一步必须为一,同一时候每一步都比前一步多一步,少一步或一样.如果想搞清楚每一步详细是如何走的,那么这道题是相当麻烦的.考虑到前后两 ...

  3. OpenMp高速分拣

    #include <stdio.h> #include<stdafx.h> #include<iostream> #include <stdlib.h> ...

  4. hadoop版本号变迁

    近期在研究hadoop时,发现hadoop的版本号非常混乱.原来的版本号都说0.X.X開始,后来发现有1.X.X和2.X.X 这样就不太清楚了. 0.20.2版本号曾经(不含该版本号)的配置文件都在d ...

  5. 8 shell命令之find

    find命令,像cd一样经常使用.只是可能大多数时间仅仅要那么一两个參数就足够使用了.或者说,勉强够用了.可是当我们主动的去翻看一下find的手冊,会发现原来更实用的功能都没实用到. 本文结合自己的使 ...

  6. TaintDroid:智能手机监控实时隐私信息流跟踪系统(一)

    1.1     摘要 现今,智能手机操作系统不能有效的提供给用户足够的控制权并且很清楚的了解到第三方的应用程序是如何使用其的隐私数据.我们使用了TaintDroid来阐明这个缺点,其是一个高效的,全系 ...

  7. ListView嵌套GridView显示不完整的解决方案

    转载注明出处:http://blog.csdn.net/allen315410/article/details/40152987 近期在做项目中,有个模块须要在ListView中嵌套一个GridVie ...

  8. mysql 多个字段拼接

    Mysql的查询结果行字段拼接,能够用以下两个函数实现: 1. concat函数 mysql> select concat('1','2','3') from test ; +--------- ...

  9. hibernate它 10.many2many单向

    在前文hibernate之5.many2one单向提到多对多关系,表结构设计是基于中间表来实现, 以下以用户与角色(多对多)为例,在Hibernate是怎样操作的 表结构设计: 类图: CRUD; S ...

  10. iOS_18_开关控制器_NavigationController_push道路_数据传输

    最后效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...