C++函数模板及隐式实例化、显式实例化、显式具体化、模板重载

函数模板是通用的函数描述,它们使用泛型来定义函数(所谓泛型简单点说就是不管传入参数的类型是什么都能得到想要的函数返回值)。

下面是一个函数模板的简单使用例子:

 第一行里的typename也可以写class,即template<class T>

class主要是为了向前兼容,两种写法都可以。至于T是模板名,除了T之外可以起其他名字。

一、实例化

在代码中包含这个模板,并不代表它会生成函数定义(即使我写了它的具体实现代码),真实的情况是,编译器在调用该max函数,遇到具体类型的时候,才生成一个max的函数实例。(注意,模板和实例有区别)。比如我遇到了一个max(1,2,3),它就生成了一个int max(int t1,int t2,int t3);这个过程就叫作实例化,准确点说,叫隐式实例化。所以,显式实例化就是直接打出代码告诉编译器这个模板有这么个实例,具体语法就是在函数声明前面加一个template,再把T换为具体的类型。

 就像第三行那样(Rectangle是我定义的结构体),需要注意的是,具体的数据类型必须与模板保持一致,也就是说,如果像下面这样就会报错:

 而且,因为实例化只是告诉编译器在调用模板函数的时候有这么个实例,它所用的具体函数实现来源于模板函数,所以显式实例化只有定义,请不要写函数实现。

那么问题来了,为什么会有显示实例化?说实话以笔者现在的水平感觉没什么特别大的用...

二、具体化

显式具体化需要与实例化区分开。

还是以这个max函数为例,我们会发现,max函数的参数列表并不能支持所有的数据类型传入,比如指针就不能传入。为了解决这一点,就有了显示具体化的概念。语法如下例

 注意与实例化语法不同的点在于template后有个<>。我们可以把显式具体化理解为——在实例化的基础上定义一种新的函数实现方式。这个具体化函数写好后,一旦编译器调用max函数时检测到其传入参数为结构体(此处是我定义的Rectangle结构体),就会自动执行这个具体化函数,而不会执行模板函数。所以,具体化是优先于常规模板。既然说到了优先项,顺便说一句,非模板函数,比如在程序里我定义的int max(int,int),这样的非模板函数是优先于具体化函数的,具体化又优先于常规模板。


三、模板重载

上面讲的具体化是针对参数列表不支持所有变量类型而设计的,虽然变量类型不能全部支持,但至少传入的参数个数是一样的,那么如果需要传入不同数量的参数呢?联想到函数的重载,自然就有模板的重载

注意在重载时要重新声明一遍template<typename T>

 其他跟函数重载没什么差别,就不再赘述了。

#-----2022年3月30日-----#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值