C++ 仿函数状态和首选项
C++ functor state and preference
我已经了解仿函数的使用及其工作原理。但我无法理解以下内容:
有人说“函数对象有一个状态”到底是什么意思?这种状态是不是不能用正常的功能来维持?有人可以举例说明吗?
什么时候喜欢什么:
函数指针 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?
我看不出函数指针和普通函数有什么区别。我不确定你的意思。
我的推荐:
- 不需要任何状态时使用普通函数。
- 在需要状态时使用仿函数。
我已经了解仿函数的使用及其工作原理。但我无法理解以下内容:
有人说“函数对象有一个状态”到底是什么意思?这种状态是不是不能用正常的功能来维持?有人可以举例说明吗?
什么时候喜欢什么: 函数指针 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?
我看不出函数指针和普通函数有什么区别。我不确定你的意思。
我的推荐:
- 不需要任何状态时使用普通函数。
- 在需要状态时使用仿函数。