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
を使用すると、読みにくいテンプレート コンパイラ エラーが大量に発生します。