一、定义
(1)通过template关键字来声明使用模板
(2)通过typename或者class关键字来定义模板类型
template<typename T1, typename T2>
void Func(T1 objT1, T2 objT2)
{
//函数内部逻辑省略
}
二、调用
(1)自动调用
int a = 0;
int b = 10;
Func(a,b);
(2)显示调用
int a = 0;
int b = 10;
Func<int, int>(a,b);
三、函数模板重载
- 函数模板可以像普通函数一样被重载
- 函数模板不接受隐式转换
- 当有函数模板,以及普通重载函数时,编译器会优先考虑普通函数
- 如果普通函数的参数无法匹配,编译器会尝试进行隐式转换,若转换成功,便调用普通函数
- 若转换失败,编译器便调用函数模板
- 可以通过空模板实参列表来限定编译器只匹配函数模板
#include <iostream>
using namespace std;
template <typename T>
T Max(T a,T b)
{
cout<<"T Max(T a,T b)"<<endl;
return a > b ? a : b;
}
template <typename T>
T Max(T* a,T* b) //重载函数模板
{
cout<<"T Max(T* a,T* b)"<<endl;
return *a > *b ? *a : *b;
}
int Max(int a,int b) //重载普通函数
{
cout<<"int Max(int a,int b)"<<endl;
return a > b ? a : b;
}
int main()
{
int a=0;
int b=1;
cout<<"a:b="<<Max(a,b) <<endl ; //调用普通函数 Max(int,int)
cout<<"a:b="<<Max<>(a,b)<<endl; //通过模板参数表 调用 函数模板 Max(int,int)
cout<<"1.5:2.0="<<Max(1.5,2.0)<<endl;
//由于两个参数默认都是double,所以无法隐式转换,则调用函数模板 Max(double,double)
int *p1 = new int(1);
int *p2 = new int(2);
cout<<"*p1:*p2="<<Max(p1,p2)<<endl; // 调用重载函数模板 Max(int* ,int* )
cout<<"'a',100="<< Max('a',100)<<endl;
//将char类型进行隐式转换,从而调用普通函数 Max(int,int)
delete p1;
delete p2;
return 0;
}
运行:
int Max(int a,int b)
a:b=1
T Max(T a,T b)
a:b=1
T Max(T a,T b)
1.5:2.0=2
T Max(T* a,T* b)
*p1:*p2=2
int Max(int a,int b)
'a',100=100
四、其他
(1)模板(函数模板和类模板)必须在头文件中定义和实现,定义和实现不能分开
(2)函数模板在调用时可以省略制定参数类型,但是如果返回值参数作为了模板类型,则必须需要指定返回值模板类型.因为编译器无法推导出返回值类型
参考: