C++的模板的具体化

创作内容不易,学习的朋友麻烦关注下博主,后面学习不迷路。有不会的问题也可以论坛咨询博主,博主也会及时回复~~

类模板与函数模板很相似,所以可以有隐式实例化,显式实例化,显式具体化。它们统称为具体化。

模板以泛型的方式描述类,而具体化是使用具体的类型生成类声明

目录

1.隐式实例化

2.显式实例化

3.显式具体化

4.部分具体化


1.隐式实例化

它们声明一个或多个对象,指出所需的类型,而编译器使用通用模板提供的处方生成具体的类定义。

2.显式实例化

当使用关键字template并指出所需类型来声明类时,编译器将生成类声明的显式实例化。声明必须位于模板定义所在的名称空间中。

当编译器遇到显式实例化声明时,表示实例化定义在程序的其他地方(相对于当前cpp文件)即在其他某一个cpp文件中定义,因此不再按照模板进行类型推导去生成隐式实例化定义。

当编译器遇到显式实例化定义时,根据定义所提供的模板实参去实例化模板,生成针对该模板实参的实例化定义。

注意看黄色下划线部分的显式实例化,这里虽然没有创建或提及类对象,编译器也将生成类声明(包括方法为定义)。这里ArrayTP<int,100>我们称为模板具体化,这里也叫做隐式实例化。

3.显式具体化

显式具体化是特定类型(用于替换模板中的泛类)的定义。有时候,可能需要在为特定类型实例化时,对模板进行修改,使其行为不同。在这种情况下,可以创建显式具体化。

具体化类模板定义的格式

template <> class Classname<specialized-type-name>

class Classname<specialized-type-name> {};

这里我定义了一个专门针对传入参数类型为int的base类,这个类的show方法将打印int。

4.部分具体化

C++允许部分具体化,及部分限制模板的通用性。部分具体化可以给类型参数之一指定具体的类型。

这里先看下红色下划线部分,这里我们定义模板base又两个类型参数分别是T1,T2。然后再看下黄色下划线,关键字template后面的<>声明的是没有被具体化的类型参数。所以上述第二个声明将T2具体化为int,但T1保持不变。如果要指定所有的类型,则让<>内为空,这将导致显式具体化。

下面我们来看个有趣的例子

在这个例子当中,我们通过为指针提供特殊版本来部分具体化现有的模板。

这里因为使用了具体化的原因,所以base<char*>y将使用通过版本;将T转换为char。

而如果没有使用具体化的花,则会将T转换为char *


我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~

如果朋友你感觉文章的内容对你有帮助,可以点赞关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小天才哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值