模板函数
当我们要对不同的数据类型进行同样的操作的时候,
我们可能要分别编写几个函数去对应数据类型进行相似的操作,比如说交换两个数据
我们使用函数模板就会大大提高效率
示例:
#include <iostream>
using namespace std;
template <typename T>//声明一个模板,T是一个通用数据类型
//或template<class T>
void Exchanged(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
void example()
{
int a = 1;
int b = 2;
char c = 's';
char d = 'd';
//1、自动类型推导
Exchanged(a, b);
//2、显式指定类型
Exchanged<int>(a,b);
Exchanged(c, d);
cout << "a = " << a << "b = " << b << endl;
}
int main()
{
example();
return 0;
}
这里有两个注意事项:
在使用函数模板的时候,T的类型必须可知,才可以使用
在使用自动类型推导函数模板的时候,数据类型必须一致。
普通函数与函数模板的区别
#include <iostream>
using namespace std;
int myAdd(int a, int b)
{
return a + b;
}
template<class T>
T myAdd2(T a, T b)
{
return a + b;
}
int main()
{
int a = 1;
int b = 2;
char c = 'c';
cout << myAdd(a, b) << endl;
cout << myAdd(a, c) << endl;//不会报错,会自动进行类型转换
//cout << myAdd2(a, c)) << endl; //如果传进a和c则报错 自动类型推导不发生自动类型转换
cout << myAdd2<int>(a, c) << endl;//指定类型不会报错 显式指定类型 发生隐式类型转换
return 0;
}
模板函数与普通函数同名会先调用谁
#include <iostream>
using namespace std;
//普通函数
void myPrint(int a,int b)
{
cout << "普通函数调用" << endl;
}
//函数模板
template<class T>
void myPrint(T a, T b)
{
cout << "函数模板调用" << endl;
}
//函数模板重载
template<class T>
void myPrint(T a, T b, T c)
{
cout << "重载函数模板调用" << endl;
}
void example()
{
int a = 1;
int b = 2;
//myPrint(a, b);//结果 普通函数调用
//myPrint<>(a, b);//结果 函数模板调用 空模板参数列表,强制调用函数模板
char c1 = 'z';
char c2 = 's';
myPrint(c1, c2);
}
int main()
{
example();
return 0;
}
总结:
优先调用普通函数
如果想强制调用模板函数,可以使用空参数列表
如果函数模板可以更好匹配使用条件,则优先调用函数模板
函数模板也可以进行重载
注意:一般提供了模板函数,就不要再使用同名的普通函数。