我希望在以下结构中有一个命名联合,这样我就可以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} {}
};
Run Code Online (Sandbox Code Playgroud)
如何初始化构造函数中的字段?既没有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 };
};
};
Run Code Online (Sandbox Code Playgroud)
您只能初始化Literal其 c'tors 成员初始值设定项列表中的直接成员。由于缩小转换范围,联合成员的聚合初始化将不起作用。所以你的选择是:
递归以强制联合字段被视为类的字段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} {}
Run Code Online (Sandbox Code Playgroud)
上面允许您根据匿名联合成员的名称引用每个字段,以及使用命名v成员将它们集中在一起。但我会第一个承认,这很丑陋。
| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |