C++函数模板的具体化

在代码中声明函数模板的时候,是不会生成函数定义的,当编译器使用模板为特定类型生成函数定义时,得到的是模板实例。
例如如下代码,这样的模板并非函数定义。

template<class T>
void Swap(T &a, T &b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}

函数模板的具体化又分为隐式实例化、显示实例化、显示具体化。
1、隐式实例化

int main()
{
    int a = 10, b = 20;
    Swap(a, b);
}

在上述代码中,函数调用Swap(i,j)导致编译器生成Swap实例,这种实例化称为隐式实例化,因为编译器之所以知道需要进行定义,是由于程序调用了Swap函数时提供了int参数,这种实例化的方式存在效率低下的缺点,因为其无法在程序编译时就生成函数定义。
2、显示实例化
显示实例化可以解决隐式实例化的缺点,其可以直接命令编译器创建特定的实例,其语法为如下
template void Swap<int>(int, int);
3、显示具体化
显示具体化主要针对特殊的数据类型,如结构体,其可以对底层的模板进行改动,从而使其针对这种特殊的数据类型执行特定的操作。例如以下代码,我声明了一个结构体,想要只交换结构体中的salary和floor,不交换name,就要使用显示具体化。

struct job
{
    char name[40];
    double salary;
    int floor;
};

template<> void Swap<job>(job&a, job&b)
{
    double t1;
    int t2;
    t1 = a.salary;
    a.salary = b.salary;
    b.salary = t1;
    t2 = a.floor;
    a.floor = b.floor;
    b.floor = t2;
}

因此调用时,显示具体化将会优先于常规模板。

9 声望
0 粉丝
0 条评论
推荐阅读
名称空间
随着项目增大,不同的厂商的类库的名称可能会出现冲突,比如,有可能两个类库同时都定义了名称为List、Tree、Node的类,但是定义的方式不兼容,为避免上述问题,C++提供了名称空间工具,来限定不同名称的作用域。

keep阅读 305

麒麟操作系统 (kylinos) 从入门到精通 - 研发环境 - 第二十一篇 C++/C语言开发环境搭建
类别:笔记本型号:中国长城 NF14C硬件平台:飞腾处理器(ArmV8 指令集)系统:银河麒麟操作系统 V10 SP1(2203) 关键词:信创,麒麟系统,linux,c++,c,内核飞腾,arm

码上世界1阅读 2.3k评论 1

封面图
万字避坑指南!C++的缺陷与思考(下)
导读 | 在万字避坑指南!C++的缺陷与思考(上)一文中,微信后台开发工程师胡博豪,分享了C++的发展历史、右值引用与移动语义、类型说明符等内容,深受广大开发者喜爱!此篇,我们邀请作者继续总结其在C++开发过...

腾讯云开发者4阅读 464评论 1

一种将函数模板定义和声明分开的方法
&emsp;&emsp;在 C++ 中为了操作简洁引入了函数模板。所谓的函数模板实际上是建立一个通用函数,其函数类型或形参类型不具体指定,用一个虚拟的类型来表达,这个通用函数就称为函数模板。

Sharemaker阅读 838

封面图
Workflow的JSON解析器
Workflow中有一个小而美的json-parser,一千行代码写得非常典雅精致。不仅可以学习到经典的C语言写法、递归解析的架构、与内核近似的编码风格、简洁的接口设计,而且也非常方便引入项目中作为轻量级的json解析器...

1412阅读 774

C发展史的特点与常见的C语言程序
1、1963年,剑桥人学将ALGOL 60语言发展成为CPL语言。2、1967年,朝侨大学的Martin Richards 对CPL语言进行了简化,产生了BCPL语言。3、1970年,美国贝尔实验室的Ken Thompson将BCPL中的精华提炼出来,并为它起了...

菜鸟明轩阅读 710

零钱兑换
{代码...}

阿芯爱编程阅读 676

封面图
9 声望
0 粉丝
宣传栏