我认为工会对于我的想法是完美的,特别是当我认为我的代码应该运行在一个非常异构的机器系列上,特别是低功耗的机器时,让我烦恼的是人们的事实谁创建编译器似乎并不太关心引入和提供良好的联合支持,例如this table在 Unrestricted Unions 支持方面是空洞的,这是真实的对我的项目不愉快的看法。
union
有替代品可以至少模仿相同的属性吗?
答案 0 :(得分:7)
Union在大多数编译器上都得到了很好的支持,不太受支持的是包含具有非平凡构造函数(不受限制的联合)的成员的联合。实际上,在创建联合时,你几乎总是想要一个自定义构造函数,所以没有不受限制的联合更多的是不方便。
或者,您始终可以使用指向malloc-ed内存的void指针,其大小足以容纳最大成员。缺点是你需要显式的类型转换。
答案 1 :(得分:4)
联盟的一个流行替代方案是Boost.Variant。
您在其中使用的类型必须是可复制构建的。
<强>更新强> C ++ 17引入了std::variant。它的要求基于Boost.Variant。它是现代化的,以考虑到C ++ 17中的功能。它没有带来与C ++ 98编译器(如Boost)兼容的开销。它是免费的标准库。如果可以的话,最好用它作为工会的替代品。
答案 2 :(得分:3)
你总是可以使用显式转换来做同样的事情:
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相比,这是零开销。)
编辑:更像联盟,没有模板。