在一个类中使用具有成员函数的通用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 arguments
在xxcallobj
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之后,使指向可调用成员函数的指针成为可能 。 这将是最受欢迎的。