Я использовал 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
}
Вы должны использовать
eb.connect(f);
поскольку f
вызываемый объект функции, но &f
не вызывается.
Других решений пока нет …