2. 函数模板
函数模板是用来生成函数的模版。它的主要作用是用来编写与类型无关的通用函数模板,在需要时在根据类型生成相应的函数。
函数模板定义的语法
template <typename 类型参数名1 [=默认类型1], typename 类型参数名2 [=默认类型2], ...>
返回值 函数模板名(形参列表) { ... }
说明
- 类型参数名常用
T开头,如:T、T1、T2 - 类型参数的缺省参数 默认类型 可以省略。
- 模板是声明不占用存储空间,一般写在头文件中。
- 在使用函数模板时,C++会在编译阶段自动生成对应的函数代码。
- 关键字
typename可以使用 关键字class替换(class是早期版本C++使用的关键字,新版本的建议使用typename)。 - 在使用函数模板时,如果调用时不指定模板类型,编译器会根据实参类型自动尝试推导模板的类型。
- 一个
template <...>类型声明的有效范围是一个函数模板(或类模板)的定义语句。
函数模板使用的方法
函数模板名<实参类型1, 实参类型2, ...>(实参列表)
说明
- 在使用函数模板时,如果直接给出函数模板名代替函数名,不给出<实参类型列表>,则编译器会根据实参列表来自动推导模版的实参类型,如果推导失败则会报错处理。
示例
// filename: func_template.cpp
#include <iostream>
using namespace std;
template <typename T>
T myadd(T x, T y) {
return x + y;
}
int main(int argc, char * argv[]) {
cout << myadd<double>(1.2, 3.4) << endl;
cout << myadd<int>(5, 6) << endl;
cout << myadd(7, 8) << endl; // 自动推倒模板 T 的类型为 int
return 0;
}
编译和运行结果如下:
weimz@mzstudio:~$ g++ -o func_template func_template.cpp
weimz@mzstudio:~$ ./func_template
4.6
11
15
练习
尝试自己编写一个能对任何类型的数据进行冒泡排序的函数模版 bubble_sort。