您的位置:首页 > 编程语言 > C语言/C++

对c++中模板函数函数类型或者函数对象了类型显式指定的理解

2015-03-28 13:48 369 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐