如何使用std :: bind将函数与对象指针param绑定?

时间:2017-01-12 12:44:04

标签: c++ c++11

以下是我的代码:

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;:找不到匹配的重载函数 ......

1 个答案:

答案 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;
};

Demo

如果我们使用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

相关问题