【问题标题】:Get enum keyword by value [duplicate]按值获取枚举关键字[重复]
【发布时间】:2013-03-23 22:37:20
【问题描述】:

我有一个关于 C++ 枚举的基本问题。

这是一个枚举:

enum Names {
    Tim     =       0x1,
    Bob     =       0x2,
    Jim     =       0x4
};

如果我收到一个值(例如 0x4),我想打印相关名称:Jim

有办法吗? Names.key(0x04) 之类的东西? I know this exists in Java.

谢谢

【问题讨论】:

标签: c++ enums


【解决方案1】:

不,在 C++ 中没有办法做到这一点。首先,编译出枚举的名称。如果你想从整数中获取枚举类型,可以强制转换。

类似地,如果你有

Foo foo = new Foo();
String name = "John";
int age = 23;

在 C++ 中无法获取变量名。

【讨论】:

    【解决方案2】:

    不,你不能。由于反射,这在 Java 中是可能的,这是 C++ 中不存在的功能。

    你能做的最好的是将名字存储在地图中:

    std::map<Names, std::string> names_string = {
        { Tim, "Tim"},
        { Bob, "Bob"}
        // .....
    };
    
    std::cout << "Tim's enum: " << names_string[Tim] << std::endl;
    

    【讨论】:

    • 感谢您的回复。我不能使用地图,因为这个枚举是从 COM 接口生成的。
    【解决方案3】:

    不,这是不可能的。与 C++ 中的所有标识符一样,它们在运行时不再可用。也许地图或集合比枚举更适合您的用例?

    【讨论】:

      【解决方案4】:

      正如许多人所说,这在 vanilla C++ 中是不可能的。但是如果你使用 Qt,你可以定义注册到 Qt 元系统的枚举,这样你就可以在运行时检索枚举信息。

      QMetaEnum 类提供有关枚举器的元数据。

      使用 name() 作为枚举数的名称。枚举器的键( 每个枚举项)由 key() 返回;使用 keyCount() 查找 键的数量。 isFlag() 返回枚举数是否意味着 用作标志,这意味着它的值可以使用组合 OR 运算符。

      转换函数keyToValue(), valueToKey(), keysToValue(), 和 valueToKeys() 允许整数表示之间的转换 枚举或设置值及其文字表示。这 scope() 函数返回声明此枚举器的类范围 在。

       class MyClass : public QObject
       {
           Q_OBJECT
           Q_ENUMS(Priority)
      
       public:
           MyClass(QObject *parent = 0);
           ~MyClass();
      
           enum Priority { High, Low, VeryHigh, VeryLow };
           void setPriority(Priority priority);
           Priority priority() const;
       };
      

      由于整个机制使用 Qt 元系统,您只能将这种方法用于枚举,QObject 派生类的成员。

      【讨论】:

      • 好!但我想我不能从基本的enum 构建QMetaEnum,对吧?
      • 可以,但必须使用宏将其注册到元系统。但是您必须使用它来编译您的项目,否则在运行时无法访问。更新我的答案。
      【解决方案5】:

      编写你自己的函数来处理这个...

      enum Names {
          Tim     =       0x1,
          Bob     =       0x2,
          Jim     =       0x4
      };
      
      std::string GetNameString(int nName)
      {
          if( nName == Tim )
              return std::string("Bob");
          else if( nName == Bob )
              return std::string("Tim");
          else if( nName == Jim )
              return std::string("Jim");
      
          return std::string("");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 2012-08-11
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        • 2017-12-06
        相关资源
        最近更新 更多