函数对象
-
一种提供有函数调用运算符的类。
-
当编译器遇到了一个函数调用,比如
lt(ival);
,lt可能是个函数名、函数指针、提供了函数调用运算符的的函数对象;
如果lt是个类对象,那么编译器会在内部将此语句转换为lt.operator(ival);
-
函数调用运算符可以接受任意个参数。使用举例:它可被用来支持矩阵(Matrix)这个类的多维度下标操作,因为语言所提供的下标运算符仅能接受一个参数。
//测试传入值是否小于指定值的实现class LessThan
{
public:LessThan(int val):_val(val){};int comp_val()const{return _val; //基值的读取}void comp_val(int nval){_val=nval; //基值的写入}bool operator()(int value) const;private:int _val;
};//函数调用运算符的实现如下
inline bool LessThan::operator()(int value) const
{return value<_val;
}//将函数调用运算符应用于对象身上,便可以调用函数调用运算符:
int count_less_than(const vector<int>&vec,int comp)
{LessThan lt(comp);int count=0;for(int ix=0;ix<vec.size();ix++)if(lt( vec[ix] ))++count;return count;
}//通常我们会把函数对象当作参数传给泛型算法,例如:
void print_less_than(const vector<int>&vec,int comp,ostream &os)
{LessThan lt(comp);vector<int>::const_iterator iter = vec.begin(),it_end=vec.end();os<<"elemts less than "<<lt.comp_val()<<endl;while((iter = find_if(iter,it_end,lt)) != it_end){os<< *iter <<' ';++iter;}
}//练习以上两个函数
int main()
{int ia[16]={17, 12, 44, 9, 18, 45, 6, 14, 23, 67, 9, 0, 27, 55, 8, 16};vector<int>vec(ia, ia+16);int comp_val=20;cout << "Numeber of elements less than "<< comp_val << " are "<< count_less_than(vec,comp_val) << endl;print_less_than(vec,comp_val);
}//执行结果
//Numeber of elements less than 20 are 10
//elements less than 20
//17 12 9 18 6 14 9 0 8 16