`
阿尔萨斯
  • 浏览: 4150304 次
社区版块
存档分类
最新评论

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();		
}



运行截图:


这就是模版显式具体化的作用了。

需要注意的是,具体化优先于常规模版,而非模版函数优先于具体化和常规模版。


2.实例化

要进一步了解模版,必须理解术语实例化和具体化。记住,在代码中包含函数模版本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模版为特定类型生成函数定义时,得到的是模版实例,例如,上面的mSwap(i,j),函数调用mSwap(i,j)导致编译器生成mSwap()的一个实例,该实例使用int类型。

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

C++还可以显式实例化。

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

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

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




分享到:
评论

相关推荐

    C++学习之模板特例化

    这种情况下可以使用模板特例化(template specialization)。  一、函数模板特例化  当特例化一个函数模板时,必须为原模板中的每个模板参数都提供实参。使用关键字template后跟一个空尖括号&lt;&gt;,即template &...

    C++模板特例化应用实例

    模板特例化是C++程序设计中一个非常重要的应用,本文就以实例形式对其进行分析,相信对大家进一步理解C++程序设计能够带来一定的帮助。具体内容如下: 首先,模板是C++中一个很重要的特性,写一份代码能用于多种数据...

    Deeplearning深度学习笔记v5.53

    Deeplearning深度学习笔记v5.53 吴恩达机器学习笔记更新--在这 5 堂课中,学生将可以学习到深度学习的基础,学会构建神经网络,并用在包括吴 恩达本人在内的多位业界顶尖专家指导下创建自己的机器学习项目。...

    深入分析C++模板特化与偏特化

    模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。 1.2函数模板特化 函数模板特化是在一个统一的函数模板不能在所有类型实例下正常工作时,需要定义类型参数在实例化为特定类型时函数模板的特定...

    Deeplearning深度学习笔记v5.52

    本文档是针对吴恩达老师深度学习课程的学习笔记,这些课程专为已有一定基础(基本的编程知识,熟悉 Python、对机器学习有基本了解), 想要尝试进入人工智能领域的计算机专业人士准备。介绍显示:“深度学习是科技业...

    Deeplearning 深度学习笔记

    吴恩达Coursera深度学习教程中文笔记,这些课程专为已有一定基础(基本...Deep Learning Specialization对卷积神经网络 (CNN)、递归神经网络 (RNN)、长短期记忆 (LSTM) 等深度学习常用的网络结构、工具和知识都有涉及。

    吴恩达DL深度学习笔记v3.03.pdf

    Coursera深度学习教程中文笔记 课程概述 这些课程专为已有一定基础(基本的编程知识,熟悉Python、对机器学习有基本了解), 想要尝试进入人工智能领域的计算机专业人士准备。介绍显示:“深度学习是科技业最热门 ...

    Practical C++ Programming C++编程实践

    Templates: The Hard Way Templates: The C++ Way Function Specialization Class Templates Class Specialization Implementation Details Advanced Features Summary Programming Exercises 25. Standard ...

    吴恩达深度学习专项课程编程作业集合(LaTex版 Deep Learning Specialization (4 courses))

    吴恩达深度学习专项课程编程作业集合 LaTex版 共计304页 Deep Learning Specialization (4 courses) 此文档整理了 Neural Networks and Deep Learning、Improving Deep Neural Networks、Structuring Machine ...

    Modern C++ Design Generic Programming and Design Patterns Applied.pdf

    Partial template specialization Typelists—powerful type manipulation structures Patterns such as Visitor, Singleton, Command, and Factories Multi-method engines For each generic component, the ...

    Coursera深度学习笔记v3.1

    吴恩达倾力奉献,创建的Coursera的deeplearning.ia。...Deep Learning Specialization对卷积神经网络 (CNN)、递归神经网络 (RNN)、长短期记忆 (LSTM) 等深度学习常用的网络结构、工具和知识都有涉及。

    Deeplearning深度学习笔记v5.6.zip

    吴恩达的深度学习笔记翻译,里面的目录已经做好,可以直接作为书去打印,欢迎大家下载。课程概述 这些课程专为已有一定基础(基本的编程知识,熟悉Python、对机器学习有基本了解),想要尝试进入人工智能领域的...

    Learn.C++.Programming.Language.Become.A.Complete.C++.Programmer.pdf

    Title: Learn C++ Programming Language: Become A Complete C++ Programmer Author: Virender Singh Length: 1018 pages Edition: 1 Language: English Publication Date: 2015-10-01 This Book Teaches C++ In ...

    Deeplearning深度学习笔记v5.61.pdf

    Coursera 深度学习教程中文 笔记 课程概述 这些课程专为已有一定基础(基本的编程知识,熟悉 Python、对机器学习有基本了解), 想要尝试进入人工智能领域的计算机专业人士准备。介绍显示:“深度学习是科技业最...

    Deeplearning深度学习笔记v5.6.pdf

    Coursera 深度学习教程中文笔记课程概述 这些课程专为已有一定基础(基本的编程知识,熟悉 Python、对机器学习有基本了解), 想要尝试进入人工智能领域的计算机专业人士准备。介绍显示:“深度学习是科技业最热门 ...

    Exploring C++ 11

    Exploring C++ divides C++ up into bite-sized chunks that will help you learn the language one step at a time. Assuming no familiarity with C++, or any other C-based language, you’ll be taught ...

    吴恩达深度学习笔记v5.5

    这些课程专为已有一定基础(本的编知识,熟悉 Python、...Deep Learning Specialization对卷积神经网络 (CNN)、递归神经网络 、递归神经网络 (RNN)、长短期记忆 (LSTM) 等深度学习常用的网络结构、工具和知识都有涉及。

    c++_traits.pdf

    c++_traits Classes which encapsulate properties of types Is this an integer type? An arithmetic type? A pointer type?... Closely related to partial specialization

    Google C++ International Standard.pdf

    4.4 The C++ memory model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 4.5 The C++ object model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...

    coursera-robotics-specialization:coursera机器人学专业化项目和任务

    robotics_specialization Coursera机器人学专业化项目和任务

Global site tag (gtag.js) - Google Analytics