C++函子状态与偏好

C++函子状态与偏好,c++,functor,C++,Functor,我已经了解了函子的用法及其工作原理。但我无法理解以下几点: 当有人说函数对象有状态时,它的确切含义是什么?是否无法使用正常功能保持此状态?有人能举例说明吗 什么时候更喜欢什么: 函数指针vs函子vs普通函数 为了回答第一个问题,普通函数只能通过静态变量维护状态,并且在任何情况下,函数只有一个实例。因此,一个函数不可能有两个或多个具有不同状态的实例,但对于一个函子来说,这是完全可能的 要回答你的第二个问题,这三种类型实际上完全不同,目的也不同——你的问题太宽泛了 1当有人说函数对象有状态时,它的确

我已经了解了函子的用法及其工作原理。但我无法理解以下几点:

当有人说函数对象有状态时,它的确切含义是什么?是否无法使用正常功能保持此状态?有人能举例说明吗

什么时候更喜欢什么: 函数指针vs函子vs普通函数


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

要回答你的第二个问题,这三种类型实际上完全不同,目的也不同——你的问题太宽泛了

1当有人说函数对象有状态时,它的确切含义是什么?是否无法使用正常功能保持此状态

我不清楚你说的函数对象是指函数还是函子对象

函数没有状态,除非它们在函数作用域中定义了静态变量。例如:

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_;
};
但是,函子对象(即属于函子的类的实例)可能具有状态,许多对象具有状态。例如:

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);
您可能需要注意,由于函数的状态是静态的,因此它与函数的所有调用共享,而您可以有多个执行相同操作但状态不同的functor。多谢内森·奥利弗提起这件事

2什么时候更喜欢什么:函数指针vs函子vs普通函数

我看不出函数指针和普通函数之间有什么区别。我不知道你那是什么意思

我的建议是:

在不需要任何状态时使用普通函数。 需要状态时使用函子。
相关/重复:如果你问这个问题,你还不了解函数对象的用法,这个术语比函子更受欢迎。第二个问题的答案很简洁。我要注意的是,由于函数状态是静态的,它与函数的所有调用共享,在这里你可以有多个做相同事情但状态不同的函子。