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

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

У меня есть класс 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&)> вместо авто.

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

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

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

0

Решение

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

eb.connect(f);

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector