模版是泛型编程的基础。函数模版是通用的函数描述,可以用它来生成具体类型的函数。
下面介绍函数模版的基础知识。
函数的冗余问题
以交换函数为例,针对int ,double 类型,需要定义2个函数。这2个函数的实现方式是一样的,唯一的区别是不同的参数类型。如果要满足所有的类型,那就要写很多相同的代码。
void swapInt(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
void swapDouble(double& a, double& b) {
double temp = a;
a = b;
b = temp;
}
定义一个通用的函数模版可以解决这个问题。用到哪种类型,就生成该类型的函数。
函数模版语法
函数模版的语法如下,<> 包起来的是模版参数列表,可以有多个参数,用逗号分隔。下面的示例只定义了一个。
template<typename T>
函数声明或定义
template :关键字,表示定义模板
typename :关键字,表示一个类型参数
T :变量名,其值代表一个类型。在函数中使用。该变量名一般用大写表示。
定义函数模版
定义交换的函数模版
template<typename T>
void swap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
实例化函数模版
有2种使用函数模版的方式,编译器会生成一个特定版本的函数,这叫做实例化。
- 编译器自动推导类型,隐式实例化
- 显示指定类型,显示实例化
示例如下:
int main() {
int a = 1;
int b = 2;
swap(a, b);
double c = 3.0;
double d = 4.0;
swap<double>(a, b);
return 0;
}
函数模版基础总结
- 函数的冗余问题
- 解决该问题的方案:函数模版
- 如何定义函数模版
- 2种使用函数模版的方式
|