C++里的仿函数到底有什么用途?
最编程
2024-01-12 17:46:00
...
问题
C++ 仿函数是干什么用的?
回答
仿函数,其实就是重载了括号运算符 () 的对象, 不过它具有函数的一些性质, 可以在需要函数的地方(主要是各种容器和算法)使用。
struct add_x {
add_x(int val) : x(val) {} // Constructor
int operator()(int y) const { return x + y; }
private:
int x;
};
// Now you can use it like this:
add_x add42(42); // create an instance of the functor class
int i = add42(8); // and "call" it
assert(i == 50); // and it added 42 to its argument
std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
std::transform(in.begin(), in.end(), out.begin(), add_x(1));
assert(out[i] == in[i] + 1); // for all i
跟普通函数最大的不同是:仿函数可以拥有(多个)状态。就像上面的 add42
,通过构造函数里的参数传入值。这样我们在需要时,就可以再构造一个 add1
add2
来使用,更灵活。如果换成普通函数,那么就需要多传入一个参数。
C++11 带来了
std::bind
和std::function
,它们也可以完成仿函数的工作。