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

时间:2017-03-13 17:30:19

标签: c++ functor

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

  1. 当有人说“功能对象有状态”时,这意味着什么?这种状态是否无法维持正常功能?有人可以用一个例子来解释吗?

  2. 何时更喜欢: 功能指针 vs 仿函数 vs 正常功能?

2 个答案:

答案 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. 在不需要任何状态时使用普通功能。
  2. 在需要状态时使用仿函数。

答案 1 :(得分:0)

要回答第一个问题,普通函数只能通过静态变量维护状态,并且在任何情况下只有一个函数实例。因此,不可能有两个或更多具有不同状态的函数实例,但这对于函子来说是非常可能的。

要回答你的第二个问题,这三种类型实际上完全不同,并且用途不同 - 你的问题太宽泛了。