2

コールバックに使用するクラスを実装したいと考えてboost::signalいます。AddHandler()他のオブジェクトは、およびRemoveHandler()メソッドを使用してコールバック関数を登録できます。

ある SO の回答では、boost::signal::connectionから返されたオブジェクトを追跡することが提案されていますconnect()、別の回答では追跡しないことが提案されています。接続を管理する方法がわかりません。

connectionのみを持っている場合、後で切断するものをどのように調べることができslot_typeますか?

class MyClass {
public:
    typedef void Handler();
    void AddHandler(const boost::signal<Handler>::slot_type& aHandler) {
        mSignal.connect(aHandler);
    }
    void RemoveHandler(const boost::signal<Handler>::slot_type& aHandler) {
        mSignal.disconnect(aHandler); // compiler error!
    }
private:
    boost::signal<Handler> mSignal;
};

発信者が次のようなことができるようにしたい:

MyObject lMyObject;
lMySignaler.AddHandler(boost::bind(&MyObject::OnEvent, lMyObject));
...
lMySignaler.RemoveHandler(boost::bind(&MyObject::OnEvent, lMyObject));
4

1 に答える 1

0

パラメーターの型として使用するのではなく、const boost::signal<Handler>::slot_type&関数ポインターに変更しました。次に、関数ポインターを a のキーとして使用してstd::map、s を追跡しましたboost::signals::connectionRemoveHandlerが呼び出されたときdisconnectに、接続を呼び出して、マップ内のエントリを消去しました。

于 2013-06-26T20:37:30.543 に答える