C++函数模板
函数模板是用于生成函数的模板。在编译阶段,编译器会根据函数模板的使用情况创建出函数名相同,参数类型由编译器判断的若干函数。
通过函数模板创建的函数拥有相同的函数体,只是函数的参数类型不同。
函数模板的使用
每当在一个编译单元(经过预处理的.cpp文件)中使用了函数模板,则必须是在该编译单元中给出函数模板的定义。
因此,建议在头文件.h中对函数模板进行声明定义。
函数模板的声明:
template<typename T>
返回类型 函数名(参数列表);
其中T表示任意类型,参数的类型和返回类型都可以指定为T。
函数模板的定义:
template<typename T...>
返回类型 函数名(参数列表)
{
//函数体
}
下面拿一个比较两个数是否相等的函数来举例子,传进来的参数可能是int、float。所以如果不使用函数模板,我们就要实现两个函数来实现这个功能:
#include <iostream>
using namespace std;
bool isEqual(int i, int j){
return i == j;
}
bool isEqual(float i, float j){
return i == j;
}
int main(){
return 0;
}
下面就可以实现一个函数模板来简化这个函数,只需要使用函数模板实现一个函数就可以完成上面的功能。
#include <iostream>
using namespace std;
template<typename T>
bool isEqual(T i,T j){
return i ==j;
}
int main(){
return 0;
}
函数模板的特化
函数模板特化是指在实例化函数模板时,对特定类型的实参进行特殊的处理,即当实参为特定类型时,通过函数模板生成的函数会有不同的函数题。
特化时需要为函数模板添加新的定义,方式如下:
template<>
返回类型 函数名<特定的参数类型>(参数列表)
{
//函数体
}
还是拿上面的判断两个数是否相等的函数为例子,这里的int和float数据确实可以使用连等号来判断是都相等,但是并不是所有的数据都可以使用 连等号来判断是都相等。 比如string类型的数据就不可以直接使用连等号来判断是否相等。因此下面特化一个专门用于处理string类型数据判断是否相等的函数。
#include <iostream>
using namespace std;
template<typename T>
bool isEqual(T i,T j){
return i ==j;
}
template <>
bool isEqual<char*>(char* s1,char* s2)
{
return strcmp(s1, s2) == 0;
}
int main(){
return 0;
}