1

PODタイプが与えられた場合、次のようなことをすることをお勧めします:

any_pod* p = new any_pod[n];
for (std::size_t i = 0; i < n; ++i)
    new (&p[i].member) other_pod(whatever);
4

2 に答える 2

1

質問が少し主観的であることを考えると、そのようなコードは決してお勧めしません。未定義の動作であるかどうかに関係なく、まだ読みにくく、将来のメンテナーは、あなたがしていることを理解するために余分な時間 (おそらくかなりの時間) を費やす必要があります。

変数型機能が必要な場合は、必要に応じてboost::variantまたはを使用してください。boost::any

あるクラスからデータを取得し、それを別のクラスにコピー/割り当てたいだけの場合は、コンストラクターの変換と代入演算子の変換が目的です。

于 2011-11-04T17:41:50.953 に答える
0

すでに構築されたオブジェクトの上に構築することで、破壊に関する言語の保証に違反しているので、オブジェクトがPODであるかどうかに関係なく、これは行いません。

あなたは少し違うことについて質問しようとしていたのだろうか:

any_pod* p = reinterpret_cast<any_pod*>(malloc(n * sizeof(any_pod[n]));
for (std::size_t i = 0; i < n; ++i)
  new (&p[i].member) other_pod(whatever);

この場合、再構築するのではなく、生のメモリのブロックで構築するだけです。この場合、新しい配置が適切です。(このようなコードを記述しなければならないことは非常にまれですが、std :: vectorのようなものを実装するときに行う可能性のあるタイプです。)最後のポッドが終わったら、後で配列を解放するように非常に注意する必要があります。破壊されました。

于 2011-11-04T20:06:50.663 に答える