如何重载"函数调用"操作符有用吗?

lur*_*rks 25 c++ operator-overloading functor function-object

我最近发现在C++中你可以以一种奇怪的方式重载"函数调用"操作符,你需要编写两对括号来执行此操作:

class A { 
  int n;
public: 
  void operator ()() const; 
};
Run Code Online (Sandbox Code Playgroud)

然后以这种方式使用它:

A a;
a();
Run Code Online (Sandbox Code Playgroud)

什么时候有用?

Gre*_*ill 28

这可以用来创建"仿函数",这些函数就像函数一样:

class Multiplier {
public:
    Multiplier(int m): multiplier(m) {}
    int operator()(int x) { return multiplier * x; }
private:
    int multiplier;
};

Multiplier m(5);
cout << m(4) << endl;
Run Code Online (Sandbox Code Playgroud)

以上打印20.上面链接的维基百科文章提供了更多实例.

  • 你想要仿函数的主要原因是在C++中有更高阶的函数. (3认同)
  • 那么你总是可以在函数中使用静态变量来赋予它状态(或全局 - 颤抖).但两者都非常难看且容易出错.(我会使用仿函数......但它有可能) (3认同)
  • 例如,您可以将其扩展为第一次调用时乘以 m,第二次乘以 m+1 等。普通函数无法在调用之间保存任何状态信息,但函子可以。 (2认同)

Mic*_*son 18

在开始使用模板之前,使用operator()几乎没有语法上的好处.但是在使用模板时,您可以以相同的方式处理实际函数和函子(充当函数的类).

class scaled_sine
{
    explicit scaled_sine( float _m ) : m(_m) {}
    float operator()(float x) const { return sin(m*x); }
    float m;
};

template<typename T>
float evaluate_at( float x, const T& fn )
{
   return fn(x);
}

evaluate_at( 1.0, cos );
evaluate_at( 1.0, scaled_sine(3.0) );
Run Code Online (Sandbox Code Playgroud)


小智 5

使用模板实现的算法并不关心被调用的东西是函数还是函子,它关心语法.标准的(例如for_each())或您自己的.函子可以拥有状态,并在调用时执行各种操作.函数只能具有静态局部变量或全局变量的状态.