函数模板
1 模板函数语法
函数模板作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。
- 函数模板利用关键字 template
- 使用函数模板有两种方式:自动类型推导、显示指定类型
- 模板的目的是为了提高复用性,将类型参数化
语法:
1
2template<typename T>
函数声明或定义解释
template :声明创建模板
typename :表面其后面的符号是一种数据类型,可以用class代替
T :通用的数据类型,名称可以替换,通常为大写字母
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18template<class T>//声明一个模板,告诉编译器后面代码中紧跟的T是一个通用数据类型
void Swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
void test01(){
int a = 10;
int b = 20;
//利用模板实现交换
//1.自动类型推导
Swap(a,b);
//2.显示指定类型
Swap<int>(a,b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return;
}
2 函数模版注意事项
注意事项:
- 自动类型推导,必须推导出一致的数据类型T,才可以使用
- 模板必须要确定出T的数据类型,才可以使用
示例:
1 |
|
3 普通函数与模板函数的区别
普通函数与函数模板区别:
- 普通函数调用时可以发生自动类型转换(隐式类型转换)
- 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
- 如果利用显示指定类型的方式,可以发生隐式类型转换
示例:
1 | int myadd01(int a,int b){ |
4 普通函数与函数模板的调用规则
普通函数和函数模板的函数名是
可以一样的。
调用规则:
- 如果函数模板和普通函数都可以实现,优先调用普通函数
- 可以通过空模板参数列表来强制调用函数模板
- 函数模板也可以发生重载
- 如果函数模板可以产生更好的匹配,优先调用函数模板
示例:
1 | //普通函数与函数模板调用规则 |
5 模板的局限性
局限性:模板的通用性不是万能的
- 在下面的代码中,如果传入的是一个数组,就无法实现了
- 在下面的代码中如果传入的参数是子自定义数据类型也无法运行
示例:
1 | template<class T> |
- c++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供具体化的模板
示例:
1 | class Person |