当前位置: 代码迷 >> 综合 >> 仿函数(functors) / 函数对象(function objects)
  详细解决方案

仿函数(functors) / 函数对象(function objects)

热度:96   发布时间:2024-02-23 09:29:00.0

仿函数是早期的名称,c++标准规格定案后所采用的新名称是函数对象。

仿函数是一个行为类似函数的对象。 为了能够 “行为类似函数”,其类别定义中必须自定义function call运算子(operator() )。拥有这样的运算子后,我们就可以在仿函数对象后面加上一对小括号,以此调用仿函数所定义的operator()。
 

class A {
public:int operator() (int a, int b) {return a + b;}
};int main() {A objA;int c = objA(1,2);}

 

仿函数的作用:

c++ stl提供的各种算法,往往有两个版本,其中一个版本表现出最常用的某种运算,第二个版本表现出最泛化的演算流程,允许用户以template参数来指定所要采取的策略。  拿accumulate()来说,其一般行为(第一版本)是将指定范围内的所有元素相加,第二版本则允许你指定某种操作,取代第一版本中的相加行为。 以sort()为例,其第一版本是以operator< 为排序时的元素位置调整依据,第二个版本则允许用户指定任何操作,务求排序后相邻两元素都能令该操作的结果为true.

要将某种操作当作函数的入参,一个方法是将该种操作设计为一个函数,然后,将函数指针作为函数的入参,另一个方法是将该种操作设计为一个仿函数(就语言层面而言是个class), 再以该仿函数产生一个对象,并以此对象作为算法的一个参数。

嗯,既然函数指针可以满足要求,那么又何必又所谓的仿函数呢? 原因在于函数指针不能满足stl对抽象性的要求,也不能满足软件积木的要求--函数指针无法和stl其他组件(如配接器adapter)搭配,产生更灵活的变化。

 


Ref:

<STL源码剖析> chapter 7.1

  相关解决方案