Logo
Section 1 / 32

函数模板

在本节课中,我们将详细探讨函数模板。

导入

函数模板

在本节课中,我们将详细探讨函数模板。

函数模板

函数模板通过在具体函数前使用关键字 template 加上类型或非类型参数来定义。随后,将函数中的具体类型或值替换为对应的类型或非类型参数。

  • 关键字 class 或 typename 用于声明参数。
  • 第一个参数通常用名称 T 表示。
  • 参数可以在函数体中使用。

函数模板中的参数传递

在下面的代码片段中,我们将查看如何使用模板调用已初始化的变量。观察第2行,函数 xchg 中的参数 x 和 y 必须是相同类型。通过在第5行提供两个类型参数,可以使参数类型不同。在第9行,我们看到一个非类型模板参数 N。

1template <typename T> 2void xchg(T& x, T& y) { 3 // ... 4} 5 6template <typename T, typename T1> 7void add(T& x, T1& y) { 8 // ... 9} 10 11template <int N> 12int nTimes(int n) { 13 // ... 14}

实例化

用模板实参替换模板参数的过程称为 模板实例化。

编译器会:

  • 自动创建函数模板的一个实例。
  • 如果模板参数能从函数实参推导出来,则自动创建函数模板实例。

如果编译器无法从函数实参推导出模板实参,则必须显式指定。

1template <typename T> 2void xchg(T& x, T& y) { 3 // ... 4} 5 6int a, b; 7xchg(a, b); 8 9template <int N> 10int nTimes(int n) { 11 // ... 12} 13 14int n = 5; 15nTimes<10>(n);

重载

函数模板可以被重载。

以下规则适用:

  1. 模板不支持自动类型转换。
  2. 如果存在一个普通函数,其匹配程度优于或等同于已存在的函数模板,则优先使用普通函数。
  3. 可以显式指定函数模板的类型。
1func<类型>(...)
  1. 可以指定仅关注某个特定的函数模板实例化。
1func<>(...)

要了解更多关于函数模板的内容,请参考 此处。

继承

- 示例