2

どういうわけか、ポインターをboost::signals2::signalに接続できるかどうか疑問に思っていました。私の問題は次のとおりです。「信号」に接続されているオブジェクトを変更したい。例えば ​​:

class Something
{
    public:
        int x;
        bool operator()(std::string str)
        {
            std::cout << str << x << std::endl;
            return true;
        }
};


int main()
{
    boost::signals2::signal<bool (std::string)> sig;
    Something something;
    something.x = 3;
    Something* somethingElse = new Something;
    somethingElse->x = 3;
    sig.connect(something);
    sig.connect(*somethingElse); 

    something.x = 2;
    somethingElse->x = 2;

    sig("x is : ");
}

コードは常に出力します:

×は:3

そして、私はそれを出力したいと思います

×は:2

今、簡単な解決策か、boost::signals2 の目的をよく理解しているかのいずれかが欠けているように感じます。

4

2 に答える 2

4

ref参照渡ししたいファンクターを -wrap するだけです(ファンクターがスコープ外になる前に、シグナルが切断されていることを確認する必要があることに注意してください)。

Something something;
something.x = 3;

Something somethingElse;
somethingElse.x = 3;

sig.connect(something);
sig.connect(boost::ref(somethingElse)); 

something.x = 2;
somethingElse.x = 2;

sig("x is : ");

これは印刷されます

x is : 3
x is : 2

Coliruでライブを見る

于 2014-09-26T12:18:25.513 に答える
0

C++ では、オブジェクトを格納する標準的な方法は「値渡し」です。これは、元の値の有効期間への依存を避けるために、元の値のコピーが所有者によって作成されることを意味します。オブジェクトへのポインターまたは参照を格納する必要がある場合は、明示的な参照キャプチャを使用してプロキシ ホルダーを作成し、参照がホルダーより長く存続するようにする必要があります。これは多くの場合、c++ 11 で std::bind として利用できる boost::bind で実現されます。最新の方法は、参照によるキャプチャでラムダ関数を使用することです。シグナルでバインドを使用する良い例は、この回答で示されています。

于 2014-09-26T11:16:49.773 に答える