1

私はXeoによる古い熟考型消去テクニックに出くわし、そのコードをどのように修正してと.std::unique_ptr'ersstd::shared_ptr'ers

投稿のコードはここにあります。何かを含むものが供給されunique_ptrs、データshared_ptr'ersがガベージになると、コードはコンパイルされません。私が試したのは、テンプレート化された基本クラスから継承されたクラスだったので、少し複雑だったのかもしれません。さて、これは主に好奇心からです。たとえば、Boost.Anyが使用できないstd::vector場合など、複雑なオブジェクトを格納するときに便利になる可能性があるため、(一般的には)難しいのではないかと思いました。

編集: テスト中にコードにバグがあることに気付きましshared_ptr'ersunique_ptr'ers. また、このタイプの消去された新しいインスタンスAny_Virtual(Xeo によって提供されるコードのように) を、たとえばstd::unique_ptr'ers.

その場合、質問は次のようになると思います。

  1. Any_Virtualで動作するように を修正するにはどうすればよいstd::unique_ptrですか?
  2. オブジェクト、スマート ポインターを保持するstd::vector<Any_Virtual>場所、またはオブジェクトのどちらが優れたデザインになるでしょうか? それとも問題ですか?Any_Virtualstd::vector<std::unique_ptr<Any_Virtual>>
4

1 に答える 1

3

型消去を使用する場合、型消去コンテナーと互換性を保つために型が満たさなければならない要件のセットが常に存在します。このセットはモデルと呼ばれます。特に、holder<T>::cloneコピーするメンバーは、 (型の、消去される型の) コピー構築可能であること*thisを順番に必要とします。したがって、型消去クラスのモデルはコピー構築可能です。held_T

ただし、 an を含む型std::unique_ptrはそのままではコピー構築できません。

何を達成したいのかを知らずに明確な修正はありません。おそらく、モデルの厳密性を下げたいと思うかもしれません。たとえば、移動構築可能であることが必要な場合があります ( an を含む型std::unique_ptrは、箱から出してすぐに簡単に満たすことができます)。std::unique_ptrあるいは、 s を保持する型をコピー構築可能にしたい場合もあります。

私の意見では、タイプ消去でできる最悪のことは、妥協して、消去されるタイプがそのような操作自体をサポートしているかどうかに応じて、モデルの操作を条件付きで機能させることです。Any_Virtualここで、値をコピーすると、たまたまコピー不可能な構築可能な消去型の値を保持している場合、例外が発生することを意味します。

おそらくもっと心配なことに、ガベージ s を取得するという事実は、ガベージの実装または使用にstd::shared_ptr問題があることを強く示唆しています。と組み合わせて使用​​することに問題があると絶対に想定しないAny_Virtualください。実装上の問題に気付いていないので (見落とす可能性はありますが)、問題を示すプログラムの例を見てみたいと思います。std::shared_ptrAny_VirtualAny_Virtual

于 2012-08-18T17:03:53.273 に答える