【问题标题】:how to insert enumerations into another one in c++如何在c ++中将枚举插入另一个枚举
【发布时间】:2011-06-16 09:27:42
【问题描述】:

我正在使用枚举来表示系统中的所有信号,并且有一个基本信号在枚举中表示,但我想通过调用函数或类似的东西向它添加其他信号 我可以在另一个中插入一个枚举吗?

【问题讨论】:

  • 如果可能的话,请用代码示例更详细地解释您的意思。现在还不清楚你在问什么。
  • 您想在运行时向枚举添加新的枚举值吗?这是不可能也没有必要的,因为它们被编译为文字整数,所以你可以使用任何其他 int 值来扩展你的枚举
  • Extending enums in C++? 的可能重复项

标签: c++ enums enumeration


【解决方案1】:

Enum 实际上在编译时将标识符映射到整数。您不能在运行时更改它。但是对于运行时,模拟将是 std::map<std::string, int>,在这种情况下,您可以在运行时添加新值,如下所示:

std::map<std::string, int> values;

// add new values in this way
values.insert( "var1", 100 );

【讨论】:

    【解决方案2】:

    您不能扩展枚举本身,当然不能在运行时进行(无论如何这毫无意义,因为enum 只是替换数字常量的文字列表)。

    如果您实际上是想扩展代码中使用的常量列表,请继续阅读:

    您可以做的是以这种方式(或类似方式)“兼容”的另一个枚举:

    enum {
       E1_ONE,
       E1_TWO,
       E1_LAST,
    } base;
    
    enum {
       E1_THREE = E1_LAST,
       E1_FOUR,
       E1_EXT_LAST,
    } extension;
    

    并在处理新值的代码中使用 enum extension 类型,但在要扩展的旧代码中使用 enum base 类型。

    enum 基本上是一个具有限制值的整数,因此您必须验证限制等。

    如果您可以访问原始源代码(我假设您这样做...),最好更改原始枚举,恕我直言。

    【讨论】:

      【解决方案3】:

      根据您最近的回复,我的猜测是您想要一个枚举代码列表,并且您想随意修改该列表?

      如果是这种情况,那么只需创建一个 int 的列表/向量/集合。这将保存您的值,与您的枚举类型无关(因为所有枚举都使用隐藏的整数值初始化)。然后,您可以随意添加/删除此列表中的项目。

      例子:

      enum SignalsA {
              X,
              Y,
              Z
      };
      
      enum SignalsB {
              A,
              B,
              C
      };
      
      int main(){
      
              std::set<int> signal_set;
      
              signal_set.insert(Z); //Insert enum value from SignalsA
              signal_set.insert(A); //Insert enum value from SignalsB
      }
      

      【讨论】:

      • 我认为这对我的代码会有所帮助,谢谢 :) 但我有一个问题是 set 因为我想将最后两行放在一个单独的函数中,而不是在主函数中
      • 我不确定我是否理解你的问题。你在问什么 set 是什么? Set 是一个关联容器,您可以在其中存储多种类型,并通过它们的值访问它们。文档在这里:cplusplus.com/reference/stl/set 您可以创建单独的函数来接收 std::set& 和 int,然后将该 int 插入到函数参数中的 set 列表中。
      • 我想在另一个函数而不是主要函数中访问两个枚举
      • 您可以创建一个函数(std::set& signal_list, int enum_value) 并将值插入单独的函数中。或者你可以创建一个更具体的函数(std::set& signal_list, SignalsA enum_value)
      • 很高兴我能帮上忙 :) 如果它解决了您的问题,您能接受答案吗?这样,未来有同样问题的人可以更轻松地解决它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      相关资源
      最近更新 更多