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
.上面链接的维基百科文章提供了更多实例.
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())或您自己的.函子可以拥有状态,并在调用时执行各种操作.函数只能具有静态局部变量或全局变量的状态.