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 粉丝
推荐阅读
名称空间
随着项目增大,不同的厂商的类库的名称可能会出现冲突,比如,有可能两个类库同时都定义了名称为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
一种将函数模板定义和声明分开的方法
  在 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。