共用体は私が考えているものに最適であり、特に私のコードが本当に異種のマシンのファミリー、特に低電力のマシンで実行されるべきだと考えるとき、私を悩ませているのは、コンパイラを作成する人々がは、優れたユニオン サポートの導入と提供についてあまり気にしていないようです。たとえば、この表は、無制限のユニオンサポートに関しては事実上空であり、これは私のプロジェクトにとって本当に不快な見方です。
union
少なくとも同じプロパティを模倣できる代替手段はありますか?
ユニオンはほとんどのコンパイラで十分にサポートされていますが、十分にサポートされていないのは、非自明なコンストラクタ (無制限のユニオン) を持つメンバーを含むユニオンです。実際には、共用体を作成するときはほとんど常にカスタム コンストラクターが必要になるため、無制限の共用体がないことは不便です。
または、最大のメンバーに十分なサイズを持つ malloc されたメモリを指す void ポインターをいつでも使用できます。欠点は、明示的な型キャストが必要になることです。
ユニオンに代わる人気のあるものの1つは、Boost.Variantです。
その中で使用するタイプは、コピー構築可能である必要があります。
更新: C++17でstd::variantが導入されました。その要件はBoost.Variantに基づいています。C++17の機能を考慮して最新化されています。C ++ 98コンパイラ(Boostなど)と互換性があるというオーバーヘッドはありません。標準ライブラリが無料で付属しています。可能な場合は、ユニオンの代わりに使用することをお勧めします。
明示的なキャストを使用して、本質的に同じことをいつでも実行できます。
struct YourUnion {
char x[the size of your largest object];
A &field1() { return *(A*)&x[0]; }
int &field2() { return *(int*)&x[0]; }
};
YourUnion y;
new(&y.field1()) A(); // construct A
y.field1().~A(); // destruct A
y.field2() = 1;
// ...
(これは、Boost.Variant などと比較してゼロ オーバーヘッドです。)
編集:より労働組合に似ており、テンプレートはありません。