初始化聚合联盟

时间:2009-08-05 09:00:58

标签: c++ const unions

我有一个工会:

union my_union 
{ short int Int16; float Float; };

我想创建:

const my_union u1 = ???;
const my_union u2 = ???;

并将它们的值初始化为不同类型: u1 - > INT16 u2 - >浮

我该怎么做?如果上述情况不可行,是否有任何解决方法?

3 个答案:

答案 0 :(得分:10)

union可以有任意数量的构造函数 - 这适用于没有构造函数的任何数据类型,所以如果排除字符串(或指向字符串的指针),那么你的例子就好了

#include <string>
using namespace std;
union my_union 
{ 
    my_union(short i16):
        Int16(i16){}
    my_union(float f):
        Float(f){}
    my_union(const string *s):
        str(s){}

    short int Int16; float Float; const string *str;
};

int main()
{
    const my_union u1 = (short)5;
    const my_union u2 = (float)7.;
    static const string refstr= "asdf";
    const my_union u3 = &refstr;
}

有更复杂的方法来创建类,由union拥有,类必须有一个选择器(使用标量或向量数据类型) - 正确销毁字符串。

答案 1 :(得分:3)

尽管禁止非POD会员数据(如上所述),标准说:

在8.5.1.15:当用括号括起来初始化一个联合时 初始化器,大括号只能包含一个初始化器 工会的第一个成员。

所以

const my_union u1 = {1};

应该有效,但此表格不能用于第二个(及后续)成员。

答案 2 :(得分:2)

联盟不能包含非POD数据类型,例如字符串,因此您的问题毫无意义。