PODタイプが与えられた場合、次のようなことをすることをお勧めします:
any_pod* p = new any_pod[n];
for (std::size_t i = 0; i < n; ++i)
new (&p[i].member) other_pod(whatever);
PODタイプが与えられた場合、次のようなことをすることをお勧めします:
any_pod* p = new any_pod[n];
for (std::size_t i = 0; i < n; ++i)
new (&p[i].member) other_pod(whatever);
質問が少し主観的であることを考えると、そのようなコードは決してお勧めしません。未定義の動作であるかどうかに関係なく、まだ読みにくく、将来のメンテナーは、あなたがしていることを理解するために余分な時間 (おそらくかなりの時間) を費やす必要があります。
変数型機能が必要な場合は、必要に応じてboost::variant
またはを使用してください。boost::any
あるクラスからデータを取得し、それを別のクラスにコピー/割り当てたいだけの場合は、コンストラクターの変換と代入演算子の変換が目的です。
すでに構築されたオブジェクトの上に構築することで、破壊に関する言語の保証に違反しているので、オブジェクトが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のようなものを実装するときに行う可能性のあるタイプです。)最後のポッドが終わったら、後で配列を解放するように非常に注意する必要があります。破壊されました。