导入
函数模板
在本节课中,我们将详细探讨函数模板。
函数模板
函数模板通过在具体函数前添加 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);
重载
函数模板可以被重载。
以下规则适用:
- 模板不支持自动类型转换。
- 如果存在一个普通函数,其匹配程度优于或等于已存在的函数模板,则优先使用普通函数。
- 可以显式指定函数模板的类型:
1func<类型>(...) - 可以指定仅关注某个特定的函数模板实例化:
1func<>(...)
要了解更多关于函数模板的信息,请参考 cppreference.com。
在下一课中,我们将学习函数模板的示例。