如何检查联合的“最终”类型?

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)

vz0*_*vz0 5

你不能。您要么需要事先知道初始化值,要么将联合添加到某个更大的结构中。请参阅此其他 SO 问题

更新:

C++ 上的联合只是为了与 C 代码兼容,你很少需要它们。即使您正在创建一些花哨的网络协议,您也会使用像google-protobuf这样的工具而不是手工制作的联合。联合的最初目标是在不同的字段或结构上重叠字节,在这些数据结构上保存尽可能多的字节,同时保留编译器支持。

在 C++ 上,您最好创建一个类层次结构,并将每个变体作为基类的子类。在内部,您还将有一个鉴别器,即 C++ vtable,但鉴别是由编译器处理的。与手工制作的联合相比,它更易于维护且不易出错。