C++ 模板

2025 年 8 月 29 日 | 阅读 9 分钟

C++ 模板是 C++ 中新增的一个强大功能。它允许我们定义泛型类和泛型函数,从而为泛型编程提供支持。泛型编程是一种技术,其中泛型类型用作算法的参数,以便它们可以适用于多种数据类型

模板的类型

C++ 中主要有两种类型的模板。

C++ Templates

现在,我们将逐一讨论这些模板。

1) 函数模板

C++ 中,函数模板使我们能够编写可与任何数据类型一起使用的泛型函数。泛型函数定义了一组可以应用于各种数据类型的操作。

函数中使用的数据类型在编译时确定。函数调用取决于数据类型。例如,快速排序算法可以使用函数模板实现。它使相同的排序函数能够处理整数、双精度浮点数、浮点数以及其他几种数据类型的多个数组。

可以使用关键字 `template` 创建泛型函数。此关键字定义了一个模板参数,它充当数据类型的占位符。

函数模板语法

它具有以下语法:

在这个语法中,

  • Ttype: 它是函数使用的数据类型的占位符名称。它在函数定义内部使用。它只是一个占位符,编译器会自动用实际数据类型替换此占位符。
  • class: `class` 关键字用于在模板声明中指定泛型类型。

C++ 函数模板示例

让我们举一个例子来说明 C++ 中的函数模板。

示例

编译并运行

输出

Addition of i and j is : 5
Addition of m and n is : 3.5

说明

在上面的例子中,我们创建了一个函数模板,它可以对任何类型执行加法操作,无论是整数、浮点数还是双精度浮点数。

带多个参数的函数模板

在 C++ 中,我们可以通过使用逗号分隔列表来在模板函数中使用多个泛型类型。

语法

它具有以下语法:

在此语法中,我们看到模板函数可以接受任意数量的不同类型的参数。

C++ 带多个参数的函数模板示例

让我们举一个例子来说明 C++ 中带多个参数的函数模板。

示例

编译并运行

输出

Value of a is : 10
Value of b is : 20
Value of c is : 30.5

说明

在上面的例子中,fun() 函数的模板被重载,其中定义了两个版本的 fun() 函数。第一个接受一个泛型参数,另一个接受两个可能不同类型的泛型参数。当调用 fun(10) 时,调用单参数版本;当调用 fun(20, 30.5) 时,使用双参数版本。

函数模板的限制

在 C++ 中,函数模板不能对函数的所有版本执行相同的操作,尤其是在功能不同时。

C++ 函数模板限制示例

让我们举一个例子来说明 C++ 中函数模板的限制。

示例

编译并运行

输出

value of a is : 4.6
Number is even

说明

在此示例中,我们重载了普通函数。我们无法重载泛型函数,因为这两个函数具有不同的功能。第一个显示值,第二个确定数字是否为偶数。

2) 类模板

在 C++ 中,类模板也可以类似于函数模板的方式定义。当一个类使用模板的概念时,该类被称为泛型类。

我们可以为类定义一个模板。例如,可以为数组类创建一个类模板,该模板可以接受各种类型的数组,例如 int 数组、float 数组和 double 数组。

语法

在这个语法中,

  • Ttype: 这是一个占位符名称,将在类实例化时确定。我们可以使用逗号分隔列表定义多个泛型数据类型。Ttype 可以在类体内部使用。

现在,我们创建一个类实例

其中,

  • class_name: 它表示类的名称。
  • type: 它表示类操作的数据类型。
  • ob: 它表示对象的名称。

C++ 类模板示例

让我们举一个例子来说明 C++ 中的类模板。

示例

编译并运行

输出

Addition of num1 and num2 : 11

说明

在此示例中,我们为类 A 创建了一个模板。在 main() 方法内部,我们创建了名为 'd' 的类 A 的实例。

带多个参数的类模板

在 C++ 中,我们可以在类模板中使用多个泛型数据类型,每个泛型数据类型都用逗号分隔。

语法

它具有以下语法:

C++ 带多个参数的类模板示例

让我们举一个简单的例子,当一个类模板包含两个泛型数据类型时。

示例

编译并运行

输出

Values of a and b are : 5,6.5

说明

在此示例中,我们使用了一个带有两个类型参数(T1 和 T2)的类模板,这允许我们创建具有不同数据类型的类对象。之后,类 A 存储并显示类型 T1 和 T2 的两个值。在 main() 函数中,创建了一个类型为 A 的对象 d,其值为 5 和 6.5,并且 display() 函数显示了这些值。

非类型模板参数

在 C++ 中,模板可以包含多个参数,我们还可以使用非类型参数。除了类型 T 参数之外,我们还可以使用其他类型的参数,例如字符串、函数名、常量表达式和内置类型。

语法

它具有以下语法:

在上述情况下,非类型模板参数是 `size`,因此模板将数组的大小作为参数提供。

参数在创建类的对象时指定

C++ 非类型模板参数示例

让我们举一个例子来说明 C++ 中的非类型模板参数。

示例

编译并运行

输出

1 2 3 4 5 6 7 8 9 10

说明

在此示例中,创建了一个包含非类型模板参数(即 `size`)的类模板。它在创建类 'A' 的对象时指定。

函数重载与函数模板的区别

C++ 中函数重载和函数模板之间的一些区别如下

特点函数重载函数模板
目的函数重载定义了多个同名但参数不同的函数。它允许我们编写与任何数据类型一起使用的泛型函数。
灵活性它在显式定义重载方面具有有限的灵活性。它对泛型编程更具灵活性。
语法它定义了多个同名但参数不同的函数。它使用 `template` 和其他一些类似的模板声明。
代码重复它需要手动编写每个函数版本。它有助于减少代码重复。
维护它更难维护。它易于维护。

C++ 模板选择题

1) 以下哪个选项用于泛型编程?

  1. 模块
  2. 模板
  3. 抽象类
  4. 虚函数
 

答案: b) 模板


2) 以下哪个选项显示了函数模板的正确语法?

  1. template<typename T> returnType functionName(T arg)
  2. template<class T> returnType functionName(T arg)
  3. template<T> returnType functionName(T arg)
  4. A 和 B 均可
 

答案: d) A 和 B 都对


3) 关于 C++ 中的类模板,以下哪个选项是正确的?

  1. 它们不能有成员函数
  2. 它们在使用前必须用特定类型实例化
  3. 它们只能接受一个类型参数
  4. 它们比普通类慢
 

答案: b) 它们在使用前必须用特定类型实例化


4) 以下代码的输出是什么?

  1. 8
    2
  2. 1
    5
  3. 2
    8
  4. 5
    1
 

答案: c) 2

8


5) 我们可以在模板中使用多类型参数吗?

  1. 是的
  2. 不能
  3. 仅适用于函数模板
  4. 仅适用于类模板
 

答案: a) 是


下一主题C++ 字符串