访问命名联合中的字段
Access fields in a named union
我想在下面的结构中有一个命名的联合,这样我就可以memcpy
它,而不知道哪个字段是"活动"的。
struct Literal {
enum class Type : size_t {
INT = 1,
LONG,
FLOAT,
DOUBLE
} type;
union {
int li;
long ll;
float lf;
double ld;
} v;
constexpr Literal(int li): type{Type::INT}, v.li{li} {}
constexpr Literal(long ll): type{Type::LONG}, v.ll{ll} {}
constexpr Literal(float lf): type{Type::FLOAT}, v.lf{lf} {}
constexpr Literal(double ld): type{Type::DOUBLE}, v.ld{ld} {}
};
如何初始化构造函数中的字段?v.li{li}
和li{li}
都不起作用。
我也尝试了v{li}
但它仅适用于第一个构造函数,因为它将其他 3 个构造函数转换为 int。
编辑:从@StoryTeller答案和评论:
struct Literal {
enum class Type : size_t {
INT = 1,
LONG,
FLOAT,
DOUBLE
} type;
union {
#define UNION_FIELDS int li; long ll; float lf; double ld;
union { UNION_FIELDS } value;
union { UNION_FIELDS };
};
};
只能在其 c'tors 成员初始值设定项列表中初始化Literal
的直接成员。由于缩小转换范围,工会成员的聚合初始化将不起作用。因此,您的选择是:
- 命名工会成员类型,并向其添加适当的 c'tor。
-
递归以强制将联合字段视为
Literal
类的字段。有一个联合的联合,并依赖于共同的初始序列保证:union { union { int li; long ll; float lf; double ld; } v; union { int li; long ll; float lf; double ld; }; }; constexpr Literal(int li): type{Type::INT}, li{li} {} constexpr Literal(long ll): type{Type::LONG}, ll{ll} {} constexpr Literal(float lf): type{Type::FLOAT}, lf{lf} {} constexpr Literal(double ld): type{Type::DOUBLE}, ld{ld} {}
以上允许您根据非匿名工会成员的名称引用每个字段,以及使用命名的
v
成员将它们集中在一起。但我会第一个承认,这很丑。
相关文章:
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 如何在 c++ 中使用多态性访问派生类字段?
- 无法访问 Arduino 结构字段。错误"退出状态 1。xxxx 不命名类型"
- 如何访问 VTK 的类枚举字段
- 从一个类访问私有字段到另一个与C++中的前一个类无关的私有字段 (OOP)
- 访问向量字段的键 - 枚举类还是命名空间中的枚举?
- 在C++中使用 RapidJSON 访问 JSON 数组的字段
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 如何从 QWizardPage 和访问字段()运行 QThread
- 访问基类中直接受保护的字段
- C++无法访问继承类中的字段
- 派生类中的成员字段别名(无访问器功能)
- 如何使用运算符 [] 访问结构的指定字段值
- 返回对位字段的访问类型
- 如何使用指向该数组的指针访问结构数组中包含的结构中的字段?[C++]
- 从测试程序访问共享库中具有静态私有字段的类
- Armadillo CPP:3D字段的访问切片
- 如何在C++的专用模板类中访问模板类成员字段
- 在一个结构中,使用一个数组字段访问另一个是否合法
- C 运行时字段访问