函数对象(Function Objects)
函数对象(Function Objects)
前言:
在前面讨论函数的弹性设计时,我们介绍了通过函数指针的方式来扩展函数的弹性,在此,基于同样的目的我们引入函数对象这个概念。
1.定义:
函数对象顾名思义,是行为类似函数的对象;
class absInt{
int operator() (int val){
return val<0 ? -val:val;
}
}
像世间万物一样,函数对象有共性也有个性,所有函数对象的共性是,都重载了调用操作符(如上所示),其个性是不同的函数对象定义了执行不同操作的调用操作符,如plus重载了执行+操作符的调用操作符,equal_to重载了执行==的调用操作符,这样做的效果是这个类的对象可以像函数一样使用。
如:
int i=-42;
absInt absObj;
int ui=absObj(i);
最终ui值为42;
2.使用:
函数对象的使用场合主要是指定泛型算法的条件,即覆盖标准库中算法使用的默认操作符,标准库中定义了一组算术,关系与逻辑运算符对象的函数对象,
使用举例:
> 对应的函数对象:greater<Type>;
sort() 函数默认操作符: <
默认情况下sort()实现一个升序的效果;
将greater函数对象传入sort();
sort(vec.begin(),vec.end(),greater<int>);
这样通过依次调用greater(val1, val2),从而实现降序排列的效果;
其他操作符函数对象的使用可以依次类推,在此不一一列举;
3.意义:
函数对象从功能上与函数指针相同,均以扩展算法弹性为目的,可以覆盖默认操作符。这样有人就有疑问了,那为何还有引入函数对象,代码晦涩,而且要重载函数调用操作符,强制的使类对象表现为函数的特点,岂不是画蛇添足,多此一举?
大错哉!实际上引入函数对象好处多多,从效率上来讲,函数对象中的函数为内联函数,消除了通过函数指针调用函数时需要付出的额外代价,提升了代码效率;
另外,标准库提供了大量的函数对象供我们使用,通过和标准库的泛型算法结合使用,从对元素的底层操作方式的层次上大大扩展泛化的层次。