我有一个关于C ++枚举的基本问题。
这是一个枚举:
enum Names {
Tim = 0x1,
Bob = 0x2,
Jim = 0x4
};
如果我收到一个值(例如0x4
),我想打印相关名称:Jim
。
有办法吗?像Names.key(0x04)
这样的东西? I know this exists in Java
由于
答案 0 :(得分:2)
您可以做的最好的事情是将名称存储在地图中:
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("");
}