3

コピーできない理由はわかりますが (シグナルのコピーには明確な意味がないためです)、ある種のコピー ctor (ノーオペレーションまたはすべての接続をコピーするもののいずれか) をboost::signal提供するバージョンが必要です。

私がこれを必要とする理由は、私のプロジェクトでは多くのオブジェクトが特徴的なシグナルのおかげでコピー不可になり、それらを快適な値のセマンティクス (shared_ptrs はそれほど快適ではありません) で扱うために、DRY に違反して手動で copy-ctors を提供する必要があるためです。明らかに、ある種の準コピー可能シグナルは、ここでの C++ の醜さに対する良い回避策です。

頭に浮かぶ最初の解決策はsignal、派生クラスでコピー ctor を継承して提供することですが、signal には仮想 dtor がないため、それはできません。

考え?

4

6 に答える 6

7

信号の代わりに、信号でポインタ(またはshared_ptr)を保持してみてください。

于 2009-03-05T19:23:19.077 に答える
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
于 2009-03-05T19:27:51.187 に答える
1

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

于 2009-03-05T23:36:50.370 に答える
1

シグナルを shared_ptr に内部的に保持すると、(デフォルトでは) シグナルはコピーされたすべてのオブジェクトで共有されます。1 つのオブジェクトでシグナルをトリガーすると、すべてのコピーのシグナルに接続されたすべてのスロットが通知されます。これは、必要な動作ではない可能性があります。

これが発生したくない場合は、独自のコピー コンストラクターとコピー代入演算子を記述できます。これにより、オブジェクトがコピーされたときに何が発生するかを指定できます。

于 2012-03-21T18:52:35.137 に答える
1

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

Decoratorパターンも参照してください。

于 2009-03-05T19:11:19.493 に答える