我已经理解了仿函数的使用及其工作原理。但我无法承担以下事项:
当有人说“功能对象有状态”时,这意味着什么?这种状态是否无法维持正常功能?有人可以用一个例子来解释吗?
何时更喜欢: 功能指针 vs 仿函数 vs 正常功能?
答案 0 :(得分:1)
1当有人说“功能对象有状态”时,它究竟意味着什么?这种状态是否无法维持正常功能?
当你说“功能对象”时,我不清楚你的意思是“函数”还是“函子对象”。
除非函数范围中定义了static
变量,否则函数没有状态。例如:
int getNextID()
{
static int nextId = 0;
return ++nextId;
}
但是,仿函数对象 - 即仿函数类的实例 - 可能具有状态,而且很多都可以。例如:
struct PrintFunctor
{
PrintFunctor(std::ostream& out) : out_(out) {}
template <typename T>
void operator()(T const& obj) { out_ << obj << " "; }
std::ostream& out_;
};
可以用作:
PrintFunctor f(std::cout);
std::vector<int> v = { 1, 2, 3 };
std::for_each(v.begin(), v.end(), f);
您可能需要注意,因为函数的状态是static
,它与函数的所有调用共享,而您可以有多个函数执行相同但具有不同状态的函数。 (感谢Nathan Oliver提出的建议)。
2什么时候更喜欢:函数指针vs仿函数与普通函数?
我没有看到函数指针和普通函数之间有任何区别。我不确定你的意思。
我的建议:
答案 1 :(得分:0)
要回答第一个问题,普通函数只能通过静态变量维护状态,并且在任何情况下只有一个函数实例。因此,不可能有两个或更多具有不同状态的函数实例,但这对于函子来说是非常可能的。
要回答你的第二个问题,这三种类型实际上完全不同,并且用途不同 - 你的问题太宽泛了。