0

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

4

2 に答える 2

3

信号にはvoid()署名があるため、パラメータは必要ありません。互換性のないboost::bind1つのパラメータ(を使用しているため)を受け取るオブジェクトを割り当てようとしています。_1したがって、エラーが発生します。evパラメータがevent_handlerどこから来るのか正確にはわかりません。_1署名の代わりに実際の値をバインドすると、互換性があります。

于 2013-02-26T12:29:23.270 に答える
0

シグナルとコールバックの署名が異なります。エラーだと思います

于 2013-02-26T12:31:01.130 に答える