函数对象
-
一种提供有函数调用运算符的类。
-
当编译器遇到了一个函数调用,比如
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