Я думаю, что союзы могут быть идеальными для того, что я имею в виду, и особенно когда я считаю, что мой код должен работать на действительно разнородном семействе машин, особенно на маломощных машинах, что меня беспокоит, так это то, что люди, которые создают компиляторы например, не слишком заботится о представлении и предоставлении хорошей профсоюзной поддержки, например этот стол практически пусто, когда дело доходит до Неограниченные Союзы поддержка, и это действительно неприятный вид для моих проектов.
Есть альтернативы union
что может хотя бы имитировать те же свойства?
Объединение хорошо поддерживается на большинстве компиляторов, но не очень хорошо поддерживаются объединения, которые содержат члены, которые имеют нетривиальный конструктор (неограниченные объединения). На практике вы почти всегда хотели бы иметь собственный конструктор при создании союзов, поэтому отсутствие неограниченного объединения — это скорее вопрос неудобства.
В качестве альтернативы, вы всегда можете использовать указатель void, указывающий на неправильно распределенную память с достаточным размером для самого большого члена. Недостаток в том, что вам нужно явное приведение типов.
Одна из популярных альтернатив союзу Boost.Variant.
Типы, которые вы используете в нем, должны быть копируемыми.
Обновить:
C ++ 17 введен станд :: вариант. Его требования основаны на 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.)
РЕДАКТИРОВАТЬ: более союзный и без шаблонов.