什么时候在C++中使用函数对象?

jas*_*ine 11 c++ stl function-object

我看到函数对象经常与STL算法一起使用.功能对象是否因为这些算法而出现?你什么时候在C++中使用函数对象?它的好处是什么?

Mat*_*lia 9

正如所说的jdv,使用仿函数而不是函数指针,它们更难以优化和内联编译器; 而且,仿函数的一个基本优点是它们可以很容易地保持对它们的调用之间的状态1,因此它们可以根据它们被调用的其他时间而以不同的方式工作,以某种方式跟踪它们使用的参数,...

例如,如果要对两个int容器中的所有元素求和,可以执行以下操作:

struct
{
    int sum;
    void operator()(int element) { sum+=element; }
} functor;
functor.sum=0;
functor = std::for_each(your_first_container.begin(), your_first_container.end(), functor);
functor = std::for_each(your_second_container.begin(), your_second_container.end(), functor);
std::cout<<"The sum of all the elements is: "<<functor.sum<<std::endl;
Run Code Online (Sandbox Code Playgroud)
  1. 实际上,正如R Samuel Klatchko在下面指出的那样,他们可以支持多个独立的状态,每个状态对应一个仿函数实例:
    一个稍微更精确的说法是,仿函数可以支持多个独立状态(函数可以通过静态/全局变量支持单个状态,既不是线程安全的也不是可重入的).
    Functors使您可以使用更复杂的状态,例如共享状态(静态字段)和私有状态(实例字段).然而,很少使用这种进一步的灵活性

  • 一个稍微更精确的说法是,仿函数可以支持多个独立状态(函数可以通过静态/全局变量支持单个状态,既不是线程安全的也不是可重入的). (2认同)
  • 我不认为那里的代码按预期工作,因为`std :: for_each`(以及我能记得的任何其他STL函数)按值而不是通过引用获取仿函数.`for_each`返回更新的仿函数,所以你想要做一些像`functor = std :: for_each(...` (2认同)

小智 8

通常使用函数对象(仿函数)而不是函数指针.函数指针存在编译器通常将它们作为原始指针传递的问题,这使得编译器很难在以后内联代码.而且它们更容易提供参数.