【C++中的模板】
C++中的模板
文章目录
- C++中的模板
- 一、模板的定义
- 二、函数模板
- 函数模板的重载
- 三、类模板
C++中的模板
C++是编译型语言,是强类型性语言。在编译时会进行很严格的类型检查,为了解决强类型语言灵活性与严格性的冲突,提出了模板。
例如函数重载时需要定义多个同名函数,但是函数参数不一致。使用模板的话只需要定义一个函数,在调用时能够智能的实例化出对应的模板。
一、模板的定义
// 示例如下template<class/typenameT>Tadd(T x,T y){returnx+y;}二、函数模板
函数模板的实例化过程:
函数模板->生成相对应的模板函数->编译->链接->可执行文件
隐式实例化与显式实例化:
隐式实例化: 没有指出转换类型
显式实例化:显示指出了转换类型
函数模板的重载
- 函数模板与函数模板的重载
名称相同,参数不同(不推荐使用交换顺序,更推荐使用参数个数不同)
- 函数模板与普通函数重载
普通函数优先于函数模板
- 头文件与实现文件形式
对模板的使用,必须要拿到模板的全部实现,如果只有一部分,那么推导也只能推导出一部分,无法满足需求。
换句话说,就是模板的使用过程中,其实没有了头文件和实现文件的区别,在头文件中也需要获取模板的完整代码,不能只有一部分。
- 模板的特化
- template后直接跟 <> ,里面不写类型
- 在函数名后跟 <> ,其中写出要特化的类型
使用模板的规则
1.在一个模块中定义多个通用模板的写法应该谨慎使用;
2.调用函数模板时尽量使用隐式调用,让编译器推导出类型;
3.无法使用隐式调用的场景只指定必须要指定的类型;
4.需要使用特化模板的场景就根据特化模板将类型指定清楚。
- 模板的参数类型
类型参数与非类型参数
指定的类型 > 推导出的类型 > 类型的默认参数
- 成员函数模板
成员函数模板不能用virtual修饰
三、类模板
(1)需要带上template模板形参列表(如果有默认参数,此处不要写,写在声明时就够了)
(2)在添加作用域限定时需要写上完整的类名和模板实参列表
