我正在编写一个包装器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
会产生大量难以阅读的模板编译器错误。