【问题标题】:Accessing active union member访问活跃的工会成员
【发布时间】:2021-07-09 10:49:47
【问题描述】:

有没有一种简单的方法可以了解哪个union 成员处于活动状态?

一个例子:

union Read_Value{
 char ch;
 float number;
 string str;
}

假设一个 void 函数从输入文件流中读取数据,并根据读取的变量类型初始化 Read_Value。假设我不知道函数是如何工作的,我怎么知道这三个成员中的哪一个处于活动状态?

【问题讨论】:

  • std::variant (C++17) 可能会有所帮助。
  • 通常的方法是存储一个'type'变量来指示哪个字段是有效的

标签: c++ c++14 unions


【解决方案1】:

一个简单的union 无法告诉您哪个是活动元素。您必须自己跟踪。


自 C++17 以来,std::variant 是“现代union”。它有一个index() 方法,可以告诉您哪个是活动索引。来自cppreference的示例:

#include <variant>
#include <string>
#include <iostream>
int main()
{
    std::variant<int, std::string> v = "abc";
 
    std::cout << "v.index = " << v.index() << '\n';
 
    v = {}; 
 
    std::cout << "v.index = " << v.index() << '\n';
}

可能的输出:

v.index = 1
v.index = 0

【讨论】:

    【解决方案2】:

    有没有一种简单的方法可以了解哪个union 成员处于活动状态?

    通常,使用标记(或区分)联合。这意味着在原始union 旁边存储一些元数据(跟踪哪个成员处于活动状态)。

    现代解决方案确实是std::variant,它为您完成所有这些。

    如果您没有 C++17 支持,请不要在您的标准库的实验或 tr 扩展中包含它,并且由于某种原因不能使用 Boost.variant 前体...您仍然可以编写旧式标记工会自己。

    不过我不会称它为简单,至少做得不好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2012-07-07
      相关资源
      最近更新 更多