大家好:
衷心希望各位点赞。
您的问题请留在评论区,我会及时回答。
一、函数模板
C++另一种编程思想为:泛型编程,主要利用的技术就是模板。
C++提供两种模板机制:函数模板、类模板
函数模板语法
函数模板作用:建立一个通用函数,它的函数返回值类型和形参类型可以不具体指定,用一个虚拟的类型来代表。
语法:
template<typename T>
函数声明或定义
解释:
template:声明创建模板
typename:表示其后面的符号是一种数据类型,可以用class代替
T:通用的数据类型,名称可以替换,通常为大写字母
#include <iostream>
#include <Windows.h>
#include <string>using namespace std;// 交换两个数
template<typename T>
void mySwap(T& a, T& b)
{T temp = a;a = b;b = temp;
}int main(void)
{int a = 10;int b = 20;// 有两种调用方式// 1、自动类型推导mySwap(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;double c = 1.1;double d = 2.2;// 2、显示指定类型mySwap<double>(c, d);cout << "c = " << c << endl;cout << "d = " << d << endl;system("pause");return 0;
}
运行截图:
总结
函数模板利用关键字template
使用函数模板有两种方式:自动类型推导、显式指定类型
模板的目的是为了提高复用性,将类型参数化。
二、函数模板注意事项
注意事项:
1.自动类型推导,必须推导出一致的数据类型T,才可以使用。
2.模板必须要确定出T的数据类型,才可以使用。
#include <iostream>
#include <Windows.h>
#include <string>using namespace std;// 利用模板提供通用的交换函数
template<typename T>
void mySwap(T& a, T& b)
{T temp = a;a = b;b = temp;
}int main(void)
{int a = 10;int b = 20;char c = 'c';// 函数模板注意事项// 自动类型推导,必须推导出一致的数据类型T,才可以使用mySwap(a, c); // 报错:没有与参数列表匹配的函数模板system("pause");return 0;
}
执行这行代码mySwap(a, c)的时候,因为变量a与变量c的数据类型不一致,导致编译器无法推导出T的数据类型,从而编译时报错。
#include <iostream>
#include <Windows.h>
#include <string>using namespace std;template<typename T>
void func()
{cout << "func 调用" << endl;
}int main(void)
{// 函数模板注意事项// 模板必须要确定出T的数据类型,才可以调用func(); // 报错:无法确定T的数据类型func<int>();// 正确:显式指定T的数据类型system("pause");return 0;
}
执行这行代码func()的时候,因为无法确定T的数据类型,所以编译器会报错。下一行代码显式指定了T的数据类型为int,所以正确。
因此,在使用函数模板的时候,需要注意:模板必须确定出T的数据类型,才可以调用函数模板。
三、普通函数与函数模板的区别
1.普通函数调用时可以发生自动类型转换(隐式类型转换)
2.函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
3.函数模板调用时,如果利用显示指定类型的方式,可以发生隐式类型转换
#include <iostream>
#include <Windows.h>
#include <string>using namespace std;// 普通函数
int myAdd01(int a, int b)
{return a + b;
}// 函数模板
template<typename T>
T myAdd02(T a, T b)
{return a + b;
}int main(void)
{// 普通函数可以发生自动类型转换int num = 10;char a = 'A'; // A:65cout << "10 + A = " << myAdd01(10, a) << endl;// 函数模板,自动类型推导时,不能发生隐式类型转换cout << "10 + A = " << myAdd02(10, a) << endl; // 报错:没有与参数列表匹配的函数模板// 函数模板,显式指定类型时,可以发生隐式类型转换cout << "10 + A = " << myAdd02<int>(10, a) << endl; system("pause");return 0;
}
执行这行代码cout << "10 + A = " << myAdd02(10, a) << endl;的时候,因为函数模板无法确定T的数据类型,所以编译时报错。
总结
建议调用函数模板时,使用显示指定类型的方式,指定T的数据类型。