C++ 仿函数状态和首选项

C++ functor state and preference

我已经了解仿函数的使用及其工作原理。但我无法理解以下内容:

  1. 有人说“函数对象有一个状态”到底是什么意思?这种状态是不是不能用正常的功能来维持?有人可以举例说明吗?

  2. 什么时候喜欢什么: 函数指针 vs 仿函数 vs 普通函数?

回答你的第一个问题,普通的函数只能通过静态变量来维护状态,而且无论如何都只有一个函数实例。因此不可能有两个或多个具有不同状态的函数实例,但这对于函子来说是非常可能的。

回答你的第二个问题,这三种类型确实完全不同,用途也不同——你的问题太宽泛了。

1 What it means exactly when someone says "function objects have a state" ? Is this state not possible to maintain with normal functions?

我不清楚你说 "function objects" 时是指 "functions" 还是 "functor objects"。

函数没有状态,除非它们在函数作用域中定义了 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 When to prefer what: Function pointers vs functors vs normal functions?

我看不出函数指针和普通函数有什么区别。我不确定你的意思。

我的推荐:

  1. 不需要任何状态时使用普通函数。
  2. 在需要状态时使用仿函数。