在一个类中使用具有成员函数的通用std :: function对象

对于一个类,我想在一个存储std::function对象的map存储一些指向同一类的成员函数的函数指针。 但是这个代码我一开始就失败了:

 class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } }; 

我收到error C2064: term does not evaluate to a function taking 0 argumentsxxcallobj error C2064: term does not evaluate to a function taking 0 arguments结合一些奇怪的模板实例化错误。 目前我正在使用Visual Studio 2010/2011在Windows 8上工作,在VS 7上使用VS10工作也会失败。 错误必须基于一些奇怪的C ++规则,我不遵循。

编辑:我使用提升。 这是MS编译器中集成的C ++ 11。

必须用对象调用非静态成员函数。 也就是说,它总是隐含地传递“this”指针作为它的参数。

因为你的std::function签名指定你的函数不带任何参数( <void(void)> ),所以你必须绑定第一个(也是唯一的)参数。

 std::function<void(void)> f = std::bind(&Foo::doSomething, this); 

如果你想用参数绑定一个函数,你需要指定占位符:

 using namespace std::placeholders; std::function<void(int,int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2); 

或者,如果您的编译器支持C ++ 11 lambdaexpression式:

 std::function<void(int,int)> f = [=](int a, int b) { this->doSomethingArgs(a, b); } 

(我现在手边没有一个支持C ++ 11的编译器,所以我不能检查这个。)

要么你需要

 std::function<void(Foo*)> f = &Foo::doSomething; 

所以你可以在任何实例上调用它,或者你需要绑定一个特定的实例,例如this

 std::function<void(void)> f = std::bind(&Foo::doSomething, this); 

如果你需要存储一个没有类实例的成员函数,你可以这样做:

 class MyClass { public: void MemberFunc(int value) { //do something } }; // Store member function binding auto callable = std::mem_fn(&MyClass::MemberFunc); // Call with late supplied 'this' MyClass myInst; callable(&myInst, 123); 

没有汽车 ,存储types会是什么样子? 像这样的东西:

 std::_Mem_fn_wrap<void,void (__cdecl TestA::*)(int),TestA,int> callable 

您也可以将此function存储传递给标准function绑定

 std::function<void(int)> binding = std::bind(callable, &testA, std::placeholders::_1); binding(123); // Call 

过去和将来的注意事项:旧的接口std :: mem_func已存在,但此后不推荐使用。 存在一个build议,在C ++ 17之后,使指向可调用成员函数的指针成为可能 。 这将是最受欢迎的。