use*_*931 2 c++ if-statement unions
假设我有一个这样的联盟:
union checkUnion{
std::string* str;
bool someBool;
int aNumber;
};
Run Code Online (Sandbox Code Playgroud)
我如何检查在程序中选择了这 3 个项目中的哪一个?我想对每个项目进行单独的 if 查询。
例如:[伪代码]
if (checkUnion == string)
{
//CODE
}
if (checkUnion == bool)
{
//DIFFERENT CODE
}
Run Code Online (Sandbox Code Playgroud)
你不能。您要么需要事先知道初始化值,要么将联合添加到某个更大的结构中。请参阅此其他 SO 问题。
更新:
C++ 上的联合只是为了与 C 代码兼容,你很少需要它们。即使您正在创建一些花哨的网络协议,您也会使用像google-protobuf这样的工具而不是手工制作的联合。联合的最初目标是在不同的字段或结构上重叠字节,在这些数据结构上保存尽可能多的字节,同时保留编译器支持。
在 C++ 上,您最好创建一个类层次结构,并将每个变体作为基类的子类。在内部,您还将有一个鉴别器,即 C++ vtable,但鉴别是由编译器处理的。与手工制作的联合相比,它更易于维护且不易出错。