3

我认为联合对于我的想法来说是完美的,特别是当我认为我的代码应该在一个真正异构的机器系列上运行时,尤其是低功率机器,让我烦恼的是创建编译器的人似乎不太关心引入和提供良好的工会支持,例如,当涉及无限制工会支持时,此表实际上是空的,这对我的项目来说是一个真正令人不快的观点。

有替代品union至少可以模仿相同的属性吗?

4

3 回答 3

9

大多数编译器都很好地支持联合,但不支持的是包含具有非平凡构造函数的成员的联合(不受限制的联合)。实际上,在创建联合时几乎总是需要自定义构造函数,因此没有不受限制的联合更多的是不便。

或者,您始终可以使用指向 malloc 内存的 void 指针,该内存具有足够大的成员大小。缺点是您需要显式类型转换。

于 2012-11-25T18:21:21.333 回答
5

union 的一种流行替代方案是Boost.Variant

您在其中使用的类型必须是可复制构造的。

更新: C++17 引入了std::variant。它的要求基于 Boost.Variant。它经过现代化改造以考虑 C++17 中的特性。它不承担与 C++98 编译器(如 Boost)兼容的开销。它随标准库免费提供。如果可用,最好将其用作工会的替代品。

于 2012-11-25T18:09:30.763 回答
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 等相比,这是零开销。)

编辑:更像工会,没有模板。

于 2012-11-25T18:12:16.737 回答