按值获取enum关键字

Get enum keyword by value

本文关键字:关键字 enum 获取      更新时间:2023-10-16

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

这是一个enum:

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

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

有办法吗?比如Names.key(0x04) ?我知道这在Java中存在。

谢谢

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

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

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

转换函数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派生类的成员。

不行。由于反射,这在Java中是可能的,这是c++中不存在的特性。

最好是将名称存储在映射中:

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

不,在c++中没有办法做到这一点。首先,枚举的名称被编译出来。如果要从整型转换为enum类型,可以进行强制类型转换。

同理,如果你有

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

在c++中无法获取变量名

不,这不可能。像c++中的所有标识符一样,它们在运行时不再可用。也许map或set比enum更适合您的用例?

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

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("");
}