我如何将class1的std :: function绑定到class2的func?

时间:2018-09-25 20:46:48

标签: c++ c++17

class foo {
public:
    std::function<void(int)> func;
};

class obj {
public:
    obj() { f.func = std::bind(&obj::update, this); }
    void update(int ms) { _ms = ms; }

private:
    int _ms;
    foo f;
};

我想绑定obj的函数,因为当foo中发生某些事情时,后者会通知其他类而不使用观察者模式。 有人可以帮我做到这一点吗?

2 个答案:

答案 0 :(得分:0)

编辑:查看您的代码,似乎在将f.func分配给std :: bind时缺少了std :: placeholders :: _ 1。执行以下操作可以解决您的问题。

obj() { f.func = std::bind(&obj::update, this, std::placeholders::_1); }

您可以按以下方式分配函数,但是说实话,我不确定如果我们将其作为std :: ref传递,这是否是一个好主意。对于本示例,我认为这不会引起问题,因为std :: bind使用move,但是如果f不是obj的成员,并且如果它通过作为引用,那么如果obj在调用f::func之前被销毁。

class foo
{
public:
    void AssignFunc(std::function<void(int)> callback)
    {
        func  = callback;
        func(10);
    }

private:
    std::function<void(int)> func;
};

class obj {
public:
    obj()
    {
        f.AssignFunc(std::bind(&obj::update, this, std::placeholders::_1));
    }
    void update(int ms)
    {
        _ms = ms;
    }

private:
    int _ms;
    foo f;
};

答案 1 :(得分:0)

您需要添加占位符,但不推荐使用std :: bind,并且在C ++ 17中将其删除,因此请不要使用它。现代C ++为我们提供了以下解决方案:

center = F

我建议您了解lambda函数以及如何使用它们。

关于std :: bind弃用 this suggestion 第三条必须死的东西,才能看到活页夹和功能对象。