【发布时间】:2012-08-26 12:55:37
【问题描述】:
我试图理解函子的“力量”。
好的,所以它们是指向函数的指针,但是它们能做什么其他没有实现operator() 的类不能做?
例如:
#include <iostream>
#include <assert.h>
#include <vector>
using namespace std;
class MultiplyBy
{
private:
int factor;
public:
MultiplyBy(int x) : factor(x) {}
int operator () (int other) const
{
return factor * other;
}
};
int main()
{
MultiplyBy temp(5);
int myResult = temp(5); // now myResult holds 25
cout << myResult << endl;
return 0;
}
我们带走了他的另一个朋友
class MultiplyOther
{
private:
int factor;
public:
MultiplyOther(int x) : factor(x) {}
int invokeMultiplyMe(int _other)
{
return _other * factor;
}
};
然后做同样的事情:
int main()
{
// MultiplyOther
MultiplyOther notFunctor(4);
int myOther = notFunctor.invokeMultiplyMe(3);
cout << myOther << endl;
return 0;
}
我们得到:
25
12
那么,函子的真正威力是什么?两个类都保存状态,还是我在这里遗漏了什么?
【问题讨论】:
-
我认为真正的力量隐藏在 lambdas 中
-
@Mr.Anubis:Lambda 是函子的语法糖,它们没有更多的权力。
-
@interjay 您可以在调用点定义它们,捕获变量等。你能用简单的函子做到这一点而不将它们作为参数等传递吗?
-
@Mr.Anubis:您可以在调用之前定义一个本地类。 lambda 中的变量捕获是将它们存储在类成员中的语法糖。任何可以用 lambda 完成的事情也可以用仿函数完成(尽管它可能更冗长)。反之则不然。
标签: c++ class function pointers functor