将一个类的成员函数传递给另一个类的std::function
的正确方法是什么?
例如,下面的Bar
想要存储Foo
个对象的一个函数。
class Foo {
public:
Foo(int x) : data(x) {}
bool isEven(int y) { return (data + y) & 0x01; }
int data;
};
class Bar {
public:
std::function<bool(int)> testFunction;
};
int main() {
Foo foo1(1);
Bar bar;
bar.testFunction = std::bind(&Foo::isEven, &foo1);
if (bar.testFunction(3)) {
std::cout << "is even" << std::endl;
}
return 0;
}
这不编译:
no match for 'operator=' (operand types are 'std::function<bool(int)>' and 'std::_Bind_helper<false, bool (Foo::*)(int), Foo*>::type {aka std::_Bind<std::_Mem_fn<bool (Foo::*)(int)>(Foo*)>}')**
答案 0 :(得分:3)
Foo::isEven
接受一个您稍后会传递的参数,因此您需要添加一个占位符来指示未绑定的参数。
bar.testFunction = std::bind(&Foo::isEven, &foo1, std::placeholders::_1);
或者只使用lambda而不是bind
bar.testFunction = [&foo1](int x) { return foo1.isEven(x); };
答案 1 :(得分:1)
您可以使用lambda:
bar.testFunction = [&foo1](int x){ return foo1.isEven(x); };