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