2016-03-16 193 views
1

将一个类的成员函数传递给另一个类的std::function的正确方法是什么?将对象的函数传递给另一个类的另一个std ::函数

例如,下面的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*)>}')** 

回答

1

您可以使用lambda:

bar.testFunction = [&foo1](int x){ return foo1.isEven(x); }; 
3

Foo::isEven需要它,你会在后面传递一个参数,所以你需要添加一个占位符来表明这个未绑定的参数。

bar.testFunction = std::bind(&Foo::isEven, &foo1, std::placeholders::_1); 

或者只是使用lambda代替bind

bar.testFunction = [&foo1](int x) { return foo1.isEven(x); }; 
相关问题