2009-03-05 7 views
3

boost::signalはコピー不可能です(信号のコピーには意味がありません)。一部のコピーctor(ノーオペレーションかコピーすべての接続)。コピーブースト::信号を作成するには?

私はこれが私のプロジェクトに多くのオブジェクトがちょうど特色信号のおかげでコピー不可となっているためで、快適な値のセマンティクスでそれらを処理するために必要な理由、私は手動でコピーを提供する必要があります(shared_ptrsがないとして快適です) - 医者、DRYに違反する。明らかに、一種の準コピー可能な信号は、ここではC++の醜さのための良い回避策となるでしょう。

最初の解決策は、signalを継承し、派生クラスにコピーctorを提供していますが、信号には仮想dtorがないため、これはno-goです。

思考?

+0

信号をコピーする際の問題は、すべての「接続」オブジェクトが古い信号を参照するということです。心に留めておきます! – Qix

答えて

1

シグナル用のプロキシオブジェクトを使用できませんか?プロキシは、シグナルと参照カウントの両方を維持します。シグナルのコピーを作成する代わりに、代理人に話をしてください。代理人は、カウントを増減します。それは動作しますか?

あなたにもDecoratorパターンを参照することもできます。

+0

これは素晴らしいですが、適切な数の引数をsignalN :: operator()()に転送するにはどうすればよいですか? –

+0

Nはあなたのケースで異なりますか? – dirkgently

+0

はい、それは0,1または2です。 –

7

シグナルの代わりにシンタックスにポインタ(またはshared_ptr)をホールドしてみてください。

2

派生しないでください。それは悪い考えです。それはあなたにはうまく行かないでしょう - 派生したクラスもコピー可能ではありません。シグナルのどの部分を公開したいのか、どのようなビヘイビアを実装したいのかは、自分のクラスで行い、boost :: signalをバックグラウンドで使用してください。

namespace Iraimbilanja { 

// the copy constructor doesn't copy the signal, so it doesn't copy the connections... 
struct EmptyOnCopySignal 
{ 
private: 
    boost::shared_ptr<boost::signal> _signal; 
}; 

// the copy constructor references the same signal, so it copies the connections... 
struct CopyableSignal 
{ 
private: 
    boost::shared_ptr<boost::signal> _signal; 
}; 

} // namespace Iraimbilanja 
3

私は信号をshared_ptrの内部で保持しています。そうすれば、オブジェクトが直接コピー可能になり、価値セマンティクスを使用することができます。

1

間違いなくあなたはboost::refを使用することができます。これがこのクラスの主な目的です。スレッドをコピーできなかった場合の以前のバージョンのブーストでも使用されていました。唯一の欠点は、信号がクラスの外部で管理されるため、コピーされたすべてのクラスに格納された参照が常に有効であることです。

1

のshared_ptrの内部信号を保持する(デフォルト)すべてのコピーされたオブジェクトによって共有されている信号をもたらします。 1つのオブジェクトで信号をトリガすると、すべてのコピーの信号に接続されているすべてのスロットが通知されます。これはあなたが望む動作ではないかもしれません。

あなたはこれが起こることをしたくない場合は、あなた自身のコピーコンストラクタを書いて、代入演算子をコピーすることができ、あなたは、あなたがあなたのオブジェクトがコピーされたときに起こるようにしたいものを指定することができるようになります。

関連する問題