3

C++函数模版实例化

 2 years ago
source link: https://davidchan0519.github.io/2019/07/23/cplus-template-explicit-instantiation/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C++函数模版实例化

Posted on

2019-07-23

| Views: 79

函数模板是C++新增的一种性质,它允许只定义一次函数的实现,即可使用不同类型的参数来调用该函数。这样做可以减小代码的书写的复杂度,同时也便于修改。但是,在代码中包含函数模板本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义时,得到的是模板实例(instantiation)

实例化有两种形式,分别为显式实例化和隐式实例化。模板并非函数定义,实例式函数定义。

显式实例化(explicit instantiation)

显式实例化意味着可以直接命令编译器创建特定的实例,有两种显式声明的方式。

比如存在这么一个模板函数

template <typename T>
void Swap(T &a, T &b)

第一种方式是声明所需的种类,用<>符号来指示类型,并在声明前加上关键词template,如下:

template void Swap<int>(int &, int &);

注意template后没有<>,区别与特化的使用

第二种方式是直接在程序中使用函数创建,如下:

Swap<int>(a,b);

显式实例化直接使用了具体的函数定义,而不是让程序去自动判断。

隐式实例化(implicit instantiation)

隐式实例化比较简单,就是最正常的调用,Swap(a,b),直接导致程序生成一个Swap()的实例,该实例使用的类型即参数a和b的类型,编译器根据参数来定义函数实例。

特化(显式)

思考这么一个问题,当前的Swap模板交换输入的两个对象,可能是基本类型也可能是自定义类。如果有这么一个需求,需要交换自定义类里的某一个属性而不是整个类,那么Swap模板就不可用,因为Swap模板交换的是整个类。
显式具体化(也称特化)将不会使用Swap()模板来生成函数定义,而应使用专门为该特定类型显式定义的函数类型。有两种定义形式,如下,其中job为用户自定义类

template <> void Swap(job &a, job &b)
template <> void Swap<job>(job &a, job &b)

显式具体化在声明后,必须要有具体的实现,这是与显示实例化不同的地方。

您的鼓励是我持之以恒的动力

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK