为boost :: signals2绑定类成员函数

时间:2013-07-23 12:15:43

标签: c++ boost c++11 boost-signals2 stdbind

我使用std :: bind创建了一个涉及类成员函数的lambda,但boost :: signals2不接受它。

我有一个课程Cut,我想通过调用Event查看新的void Cut::newEvent(Event& e)时通知我。

我创建了一个绑定到Cut实例的lambda绑定,当我向它传递一个Event时,它会按预期工作。 (代码编译,输出为“已注册的新事件”。)

然而,当我尝试将此lambda连接到boost::signals2::signal<void(Event&)>的实例时,它会抱怨消息:

error: 'f' cannot be used as a function

这很奇怪,因为我可以将它用作main()中的函数。 (如果我使用std::function<void(Event&)>而不是自动,我会得到相同的结果。

是否有可能使这项工作?为什么它目前不起作用?

这是相关代码:

#include <iostream>
#include <boost/signals2.hpp>

//Dummy event class
struct Event
{ int val; };

typedef boost::signals2::signal<void (Event&) >
EventBroadcaster;

//Class I want to notified of new events
class Cut
{
    public:
        void newEvent( Event& e)
        {
            std::cout << "Registered new event" << std::endl;
            fResult = true;
        }

        bool check() const
        { return fResult; }

    private:
        bool fResult;
};

int main()
{

    Cut c{};

    //Lambda to call newEvent on c
    auto f =
        std::bind( &Cut::newEvent, &c,
                std::placeholders::_1) ;

    Event e{};
    f(e); //works

    EventBroadcaster eb;
    eb.connect(&f); //doesn't work
}

1 个答案:

答案 0 :(得分:1)

你应该使用

eb.connect(f);

因为f是可调用的函数对象,但&f不可调用。