admin管理员组文章数量:1794759
09 非类型模板参数、模板的特化、分离编译
文章目录
- 一、非类型模板参数
- 二、模板的特化
- 2.1. 函数模板特化
- 2.2. 类模板化
- 全特化
- 偏特化
- 三、模板分离编译
- 3.1 模板为什么不支持分离编译
- 3.2. 模板的优缺点
一、非类型模板参数
模板参数有两种:1. 类型形参 2. 非类型形参。 类型形参:出现在模板参数列表中,跟在class或者typename之后的参数。 非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
比如类中需要开辟一个静态数组,但是大小未知,此时就可以使用非类型形参:
另外模板参数也可以写为缺省参数:
注意:
二、模板的特化
模板虽然不对类型进行限制,但是并不是所有类型都能得到我们想要的结果,比如这样的函数模板就无法实现我们比较字符串的目的: 这时候就需要对模板进行特化,即在原模板的基础上,针对特殊类型所进行特殊化的实现方式,模板特化中分为函数模板特化与类模板特化。
2.1. 函数模板特化函数模板的特化步骤:
比如上面的字符串类型就可以如下特化:
另外,当函数模板和类型匹配的函数同时存在时,编译器会优先调用类型匹配的函数,而不会再根据函数模板实例化出对应的函数的时候,因此可以直接将该函数直接给出,而不是进行特化:
2.2. 类模板化 全特化全特化即是将模板参数列表中所有的参数都确定化。
偏特化偏特化就是特化部分参数,或者将参数指定为指针,引用等:
当然,如果存在两个特化的模板都匹配的情况,那就会报错:
三、模板分离编译
一个程序由若干个源文件共同实现,每个源文件单独生成.o目标文件,最后将所有的目标文件,链接起来生成可执行文件的过程称之为分离编译模式。比如将函数声明写在.h头文件中,函数定义写在.cpp文件中,在主文件中包含这个头文件就可以使用其中的函数。
分离编译有以下优点:
程序要运行起来一般要经历以下四个步骤:
总结起来就是,定义的地方没有实例化,需要实例化的地方只有声明没有定义,最终导致链接错误。
解决办法:
优点:
缺点:
有些C++编译器还不支持模板,当使用这些编译器编译含有模板的代码时就会发生不兼容问题。
不支持分离编译,所有用基于模板算法的实现必须包含在整个设计的头文件中。
版权声明:本文标题:09 非类型模板参数、模板的特化、分离编译 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686785886a102674.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论