函数模板属于类属,能够处理不同的数据类型,当编译器遇到函数调用是,将根据实际参数的类型产生特定的代码,函数模板的定义形式是:
template <类型参数表>
返回值类型 函数名(形式参数表){
//函数体
}
函数模板可以为我们提供很多方便
函数重载的例子:
int square(int number){
return number*number;
}
float square(float number){
return number*number;
}
上述两个函数之间的区别是参数类型和返回值类型不一样,这种情况下我们使用函数模板更加方便。
通过函数模板实现square函数
template <class T>
T square(T number){
return number*number;
}
只要写一个函数定义就可以处理不同的数据类型,而不需要对每种数据类型都写一个单独的函数。
eg1:
#include
using namespace std;
template <class T>
T square(T number){
return number*number;
}
int main(){
int userInt;
float userFloat;
cout.precision(5);
cout<<"请输入一个整数和一个浮点数:";
cin>>userInt>>userFloat;
cout<<"他们的平方分别是:";
cout<"和"<return 0;
}
注:①函数模板本身不占用内存,当编译器遇到函数调用是,将在内存中创建一个函数实例。②模板的定义必须放在函数调用之前,通常放在程序的开头或者位于头文件中。
具有多个参数的函数模板:
template <class T>
void swapData(T &var1,T &var2){
T temp;
temp=var1;
var1=var2;
var2=temp;
}
函数模板不是一个真正意义上的函数,它仅仅是一个函数模型,当编译器遇到函数调用是,将依据模板给出的代码,通过检验参数的数据类型,产生重载函数。
具有多种类型的函数模板
template <class T1,class T2>
void swapData(T1 &var1,T2 &var2){
T1 temp;
temp=var1;
var1=var2;
var2=temp;
}
函数模板也支持重载
template <class T>
T sum(T var1,T var2){
return var1+var2;
}
template <class T>
T sum(T var1,T var2,T var3){
return var1+var2+var3;
}
当程序中有一个普通的函数(非模板),同时定义了一个模板,只要他们的参数列表不同,他们也能作为重载函数的形式共存。
float sum(float var1,float var2){
return var1+var2;
}
template <class T>
T sum(T var1,T var2,T var3){
return var1+var2+var3;
}
这也属于模板重载,当程序执行是,将根据实际调用的参数进行区分。