函数模板属于类属,能够处理不同的数据类型,当编译器遇到函数调用是,将根据实际参数的类型产生特定的代码,函数模板的定义形式是:
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<iostream>
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<<square(userInt)<<"和"<<square(userFloat)<<endl;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;
}
这也属于模板重载,当程序执行是,将根据实际调用的参数进行区分。