Связывание функций-членов класса для boost::signals2

Я использовал std::bind для создания лямбда-функции с использованием функции-члена класса, но boost::signals2 не примет ее.

У меня есть класс Cut, который я хотел бы сообщить, когда появится новый Event для просмотра, вызвав void Cut::newEvent(Event& e).

Я создал лямбда-привязку к экземпляру Cut, и это работает, как и ожидалось, когда я передаю ему событие. (Код компилируется, и выводится «Зарегистрированное новое событие».)

Однако, когда я пытаюсь подключить эту лямбду к экземпляру boost::signals2::signal<void(Event&)>, он жалуется на сообщение:

error: 'f' cannot be used as a function

что странно, потому что я могу использовать его как функцию в main(). (Я получаю тот же результат, если использую std::function<void(Event&)> вместо auto.

Можно ли сделать эту работу? Почему сейчас не работает?

Это соответствующий код:

#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
}

person paco_uk    schedule 23.07.2013    source источник


Ответы (1)


Вы должны использовать

eb.connect(f);

поскольку f является вызываемым функциональным объектом, а &f не вызывается.

person ForEveR    schedule 23.07.2013
comment
Арх! Я был убежден, что перепробовал все подобные варианты. Спасибо! - person paco_uk; 23.07.2013