按值获取enum关键字

时间:2013-04-02 14:58:20

标签: c++ enums

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

这是一个枚举:

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

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

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

由于

5 个答案:

答案 0 :(得分:2)

不,你不能。由于反射,这在Java中是可能的,这是C ++中不存在的一个特性。

您可以做的最好的事情是将名称存储在地图中:

std::map<Names, std::string> names_string = {
    { Tim, "Tim"},
    { Bob, "Bob"}
    // .....
};

std::cout << "Tim's enum: " << names_string[Tim] << std::endl;

答案 1 :(得分:2)

正如许多人所说,这在香草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派生类的成员。

答案 2 :(得分:0)

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

类似地,如果你有

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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