以下是我的代码:
class A {}; class Test { public: templateTest(TClass* _objPointer, void(TClass::*_func)(A*)) { mEventFunction = std::bind(_func, _objPointer); } private: std::function mEventFunction; }; class Demo { public: void BindFunc() { mTest = new Test(this, &Demo::testFunc); } void testFunc(A*) { } private: Test* mTest; };
我想要实现的是Demo类中的BindFunc().但是这段代码运行时出现了很多错误信息:错误C2672:'std :: invoke':找不到匹配的重载函数......
您需要为尚未绑定std::placeholders::_1
的A*
参数包含一个帐户:
#includeclass A {}; class Test { public: template Test(TClass* _objPointer, void(TClass::*_func)(A*)) { mEventFunction = std::bind(_func, _objPointer, std::placeholders::_1); } private: std::function mEventFunction; }; class Demo { public: void BindFunc() { mTest = new Test(this, &Demo::testFunc); } void testFunc(A*) { } private: Test* mTest; };
演示
A*
如果我们使用lambda代替(Demo2),我认为你需要一些占位符会更清楚一点:
templateTest(TClass* _objPointer, void(TClass::*_func)(A*)) { mEventFunction = [_objPointer, _func](A* _a){(_objPointer->*_func)(_a);}; }
lambda接受一个参数A*
,这就是你想要的.实际上,我std::bind
几乎在所有用例中都推荐使用lambda方法.