模板的定义

模板是一种通用的描述机制,使用模板允许使用通用类型来定义函数。在使用时,通用类型可被具体的类型,如 int、double 甚至是用户自定义的类型来代替。通过模板,开发者可以编写不同数据类型的相同操作,而无需为每种类型重复编写相似的代码。这不仅减少了代码冗余,提高了开发效率,还增强了类型安全性,因为模板在编译时进行类型检查,避免了运行时错误。

模板引入一种全新的编程思维方式,称为“泛型编程”或“通用编程”。

引例,想要实现能够处理各种类型参数的加法函数

以前我们需要进行函数重载(函数名相同,函数参数不同)

在使用时看起来只需要调用add函数,传入不同类型的参数就可以进行相应的计算了,很方便。

但是程序员为了这种方便,实际上要定义很多个函数来处理各种情况的参数。

模板(将数据类型作为参数)

上面的问题用函数模板的方式就可以轻松解决:

函数模板的优点:

不需要程序员定义出大量的函数,在调用时实例化出对应的模板函数,更“智能”

模板发生的时机是在编译时

模板本质上就是一个代码生成器,它的作用就是让编译器根据实际调用来生成代码。

编译器去处理时,实际上由函数模板生成了多个模板函数,或者由类模板生成了多个模板类。


模板作为实现代码重用机制的一种工具,它可以实现类型参数化,也就是把类型定义为参数,从而实现了真正的代码可重用性。

模板可以分为两类,

  1. 一个是函数模版

  2. 另外一个是类模板

通过参数实例化定义出具体的函数或类,称为模板函数模板类

函数模板

函数模板是C++中实现泛型编程的基础工具,它允许我们编写与类型无关的函数,编译器会根据调用时提供的参数类型自动生成相应的函数实例。

基本概念

函数模板定义了一个函数的模式,其中一个或多个参数的类型用模板参数表示。当调用函数模板时,编译器根据实际参数的类型推导出模板参数,并生成对应的函数代码。

模板参数推导

自动类型推导

显式模板参数

多个模板参数

多类型参数

非类型模板参数

函数模板特化

函数模板重载

变参函数模板

基本变参模板

变参模板应用

泛型算法

成员函数模板

成员函数模板是定义在类内部的模板函数,可以接受模板参数,使得同一个函数能够处理不同类型的数据。

Note

  1. 实例化时机:成员函数模板只有在被调用时才会实例化

  2. 类型推导:编译器可以自动推导模板参数类型

  3. 特化:可以为特定类型提供特化版本

  4. 继承:成员函数模板可以被继承,但不能被虚化

使用模板的规则

  1. 在一个模块中定义多个通用模板的写法应该谨慎使用;

  2. 调用函数模板时尽量使用隐式调用,让编译器推导出类型;

  3. 无法使用隐式调用的场景只指定必须要指定的类型;

  4. 需要使用特化模板的场景就根据特化模板将类型指定清楚。

类模板

基本概念

类模板是一个类的蓝图,可以根据不同的类型参数生成具体的类。它使得同一个类可以处理不同的数据类型,而不需要为每种类型重复编写代码。

多个模板参数

带默认参数的类模板

类模板特化

全特化

偏特化

智能指针类模板

类模板与继承

类模板的友元