Как передать сигнал обратного вызова (используя boost :: bind)

Я пишу обертку для boost::signals2::signal чтобы получить чище, более простой в использовании интерфейс. Вот что я придумала:

#include <boost/signals2.hpp>

// Wrapper class template for boost::signals2::signal
template<typename T>
class Signal {
typedef typename boost::signals2::signal<T> SignalType;
public:
// Trigger the signal
void operator() () { sig(); }

// Attach a listener
boost::signals2::connection operator+=(const typename SignalType::slot_type& slot)
{ return sig.connect(slot); }

private:
SignalType sig;
};

class ClassThatGeneratesEvents {
public:
void generateEvents(int n) {
while (n-- > 0) {
SomethingHappened();
}
}

Signal<void ()> SomethingHappened;
};

void func()
{
;
}

class ClassThatListensForEvents {
public:
ClassThatListensForEvents(ClassThatGeneratesEvents& ev) {
received_count = 0;

// This works
ev.SomethingHappened += func;

// This doesn't!
ev.SomethingHappened += bind(&ClassThatListensForEvents::event_handler, this, _1);
}

void event_handler() {
received_count++;
}

int received_count;
};

Я не уверен, что это лучший интерфейс-обертка, который я могу придумать, и сделать SomethingHappened публичным участником может, возможно, иметь некоторые недостатки. Хотя я не против услышать ваше мнение об этом, вопрос не в этом.

Что мне интересно, так это как передать обратный вызов += оператор. Как я написал в ClassThatListensForEvents обратный вызов функции не проблема, но с использованием результата bind дает массу трудно читаемых ошибок компилятора шаблона.

0

Решение

Ваш сигнал имеет void() подпись, поэтому она не принимает никаких параметров. Вы пытаетесь назначить boost::bind объект, который принимает один параметр (так как он использует _1), что несовместимо. Поэтому вы получаете ошибку. Не ясно, где именно вы ожидаете ev параметр для event_handler приехать из. Если вы связываете фактическое значение вместо _1 подписи будут совместимы.

3

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

Подпись сигнала и обратного вызова отличается, я думаю, что это ошибка

0

По вопросам рекламы [email protected]