温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

c++ 显示具体化和显示实例化的详细讲解

发布时间:2021-07-29 18:49:33 来源:亿速云 阅读:579 作者:chen 栏目:互联网科技

本篇内容介绍了“c++ 显示具体化和显示实例化的详细讲解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

今天看到c++ primer plus 第8章--函数探幽,其中模版函数一节有2个比较容易搞混的概念: 在此记录以下:

c++ 显示具体化和显示实例化的详细讲解

先看模版函数的定义:个人认为主要是为了节约代码量,对不同的类型完成相同的操作,如果使用函数重载的话,对于基本数据类型整形,就有short/int/long/longlong 4种,还不包括unsigned和signed,因此需要大量的重载函数,而内容都是雷同的,浪费复制粘帖的操作。因此采用模版函数来实现。

1、使用 template 或  template 放到函数开头来声明模版。其中typename是新标准,class是为了向前兼容。因此写class较为通用。

2、注意模版不能缩短可执行文件长度,在函数调用时,必须依据给出的参数类型由编译器生成实例化的模版函数(称作隐式实例化 instance),即 int add(int a, int b); 因此模版函数只是将程序员要做的事交给了编译器而已。

3、模版可以重载,见上图的模版1和模版2、模版3,注意重载是用于改变输入参数类型或增加、减少输入参数个数(后者一般通过缺省参数实现!!)。

我们输入 add(1,2)得到3,并且显示调用模版1;输入 add(1,2,3) 得到6,用模版2;输入 add(1,'A')得到'B',调用模版3; 注意模版3中多个类型的写法。

4、模版的显示具体化(重点)

c++ 显示具体化和显示实例化的详细讲解

比如对于模版2而言,我们无法用其实现 int*类型的加法,因此我们需要 specialize 这个模版,即对于int*型的输入特例化(具体化)这个模版,使其可以与原始模版不同的功能。注意显示具体化不能只声明,一定要有函数体才可以,否则vs会报链接错误!!!

我的理解是:显示具体化拓宽的模版的应用范围!原本add函数只能对重载了“+运算符”的类型使用,现在也可以对int 数组使用,但其实完全可以另写一个函数 add_array来实现这个功能,感觉就是为了好看(符合某种统一风格)所以写到一起!

5、模版的显式实例化

模版的显式实例化其实只是一个声明:template int add(int,int); 注意template后没有<>,而add后最好加上,即你自己要实例化的类型。

实际上对显式实例化的作用我也不很清楚,因为修改函数体的话使用具体化就可以了,实例化是不能带函数体的,因此参考 http://bbs.csdn.net/topics/390559301,大概能得到结论:

cout<<add(1, 2.1) 在只有模版1的情况下,会报错,因为2者的模版类型不匹配。但

cout<<add(1, 2.1) 则可以通过,因为强制产生了一个double实例化,将1和2.1都视作double,得到结果3.1

cout<<add(1, 2.1) 得到3,无庸置疑。

此外显式实例化还有一个作用:

根据《在同一文件中使用同类型的显示实例化和显示具体化会报错的特点》,先声明显示实例化,则后面的显示具体化如果存在,会报错,从而防止具体化该型模版!!

c++11中,好像可以先具体化,再实例化声明,不会报错

总结:

调用优先级:普通函数>显式具体化>显式实例化>普通模版

显式实例化用于人为选择特定的类型!

显式具体化用于修改某类型的函数具体功能!

“c++ 显示具体化和显示实例化的详细讲解”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI