c++中的模板函数可以是定义的函数具有更大的适用性,对于许多具有相同操作但是仅仅是数据类型不同的算法无需重写代码,可以提高代码的复用程度
对于一般的数据类型比如int,double的显式声明只需在<>中进行简单的声明即可。下面考虑函数类型和函数对象类型
一、函数类型
本身函数也是一个指针,根据函数的原型的不同可以将函数分为不同的种类,这里可以将与一个函数对应的函数原型声明为一种指针类型。
例如下面所示
bool gt(int a){
return a>5? true:false;
}
template <typename T,typename Fn>
int countF(T a,T b,Fn fn){
int count=0;
while(a!=b){
if(fn(*a)){
count++;
}
++a;
}
return count;
}<pre class="cpp" name="code">int main(){
typedef bool (*fun)(int);
int a[]={10,2,1213,12,435,123,1231};
int num=countF<int[],fun>(a,a+7,gt);
cout<<num<<endl;
return 0;
}
二、函数对象具有和函数相同的调用方式,但是本身他是一个对象对于他的显式的制定需要制定函数的类型
template<typename T>
class GT{
public:
GT(T a){
this->num=a;
}
bool operator()(T valR){//仿函数
return valR>this->num? true:false;
}
private:
T num;
};
int main(){
vector<int> myVec(10);
for(size_t i=0;i<10;i++){
myVec[i]=i;
}
vector<int>::iterator start=myVec.begin();
vector<int>::iterator tail=myVec.end();
num=countF(start,tail,GT<int>(5));
cout<<num<<endl;
typedef vector<int>::iterator pp;
num=countF<pp,GT<int> >(start,tail,GT<int>(5));
cout<<num<<endl;
return 0;
}