创作内容不易,学习的朋友麻烦关注下博主,后面学习不迷路。有不会的问题也可以论坛咨询博主,博主也会及时回复~~
类模板与函数模板很相似,所以可以有隐式实例化,显式实例化,显式具体化。它们统称为具体化。
模板以泛型的方式描述类,而具体化是使用具体的类型生成类声明
目录
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 *
我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈