【C++中的模板】

【C++中的模板】

C++中的模板

文章目录

  • C++中的模板
  • 一、模板的定义
  • 二、函数模板
    • 函数模板的重载
  • 三、类模板

C++中的模板

C++是编译型语言,是强类型性语言。在编译时会进行很严格的类型检查,为了解决强类型语言灵活性与严格性的冲突,提出了模板。
例如函数重载时需要定义多个同名函数,但是函数参数不一致。使用模板的话只需要定义一个函数,在调用时能够智能的实例化出对应的模板。


一、模板的定义

// 示例如下template<class/typenameT>Tadd(T x,T y){returnx+y;}

二、函数模板

函数模板的实例化过程:

函数模板->生成相对应的模板函数->编译->链接->可执行文件

隐式实例化与显式实例化:

隐式实例化: 没有指出转换类型
显式实例化:显示指出了转换类型

函数模板的重载

  1. 函数模板与函数模板的重载

名称相同,参数不同(不推荐使用交换顺序,更推荐使用参数个数不同)

  1. 函数模板与普通函数重载

普通函数优先于函数模板

  1. 头文件与实现文件形式

对模板的使用,必须要拿到模板的全部实现,如果只有一部分,那么推导也只能推导出一部分,无法满足需求。
换句话说,就是模板的使用过程中,其实没有了头文件和实现文件的区别,在头文件中也需要获取模板的完整代码,不能只有一部分。

  1. 模板的特化
  1. template后直接跟 <> ,里面不写类型
  2. 在函数名后跟 <> ,其中写出要特化的类型

使用模板的规则
1.在一个模块中定义多个通用模板的写法应该谨慎使用;
2.调用函数模板时尽量使用隐式调用,让编译器推导出类型;
3.无法使用隐式调用的场景只指定必须要指定的类型;
4.需要使用特化模板的场景就根据特化模板将类型指定清楚。

  1. 模板的参数类型

类型参数与非类型参数
指定的类型 > 推导出的类型 > 类型的默认参数

  1. 成员函数模板

成员函数模板不能用virtual修饰


三、类模板

(1)需要带上template模板形参列表(如果有默认参数,此处不要写,写在声明时就够了)
(2)在添加作用域限定时需要写上完整的类名和模板实参列表