我有一个关于 C++ 枚举的基本问题。
这是一个枚举:
enum Names {
Tim = 0x1,
Bob = 0x2,
Jim = 0x4
};
如果我收到一个值(例如0x4
),我想打印相关名称:Jim
。
有没有办法做到这一点?像Names.key(0x04)
什么?我知道这存在于 Java 中。
谢谢
我有一个关于 C++ 枚举的基本问题。
这是一个枚举:
enum Names {
Tim = 0x1,
Bob = 0x2,
Jim = 0x4
};
如果我收到一个值(例如0x4
),我想打印相关名称:Jim
。
有没有办法做到这一点?像Names.key(0x04)
什么?我知道这存在于 Java 中。
谢谢
不,你不能。由于反射,这在 Java 中是可能的,这是 C++ 中不存在的功能。
您可以做的最好的是将名称存储在地图中:
std::map<Names, std::string> names_string = {
{ Tim, "Tim"},
{ Bob, "Bob"}
// .....
};
std::cout << "Tim's enum: " << names_string[Tim] << std::endl;
正如许多人所说,这在 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 派生类的成员。
不,在 C++ 中没有办法做到这一点。首先,编译出枚举的名称。如果你想从整数获取枚举类型,你可以强制转换。
类似地,如果你有
Foo foo = new Foo();
String name = "John";
int age = 23;
在 C++ 中无法获取变量名。
不,这是不可能的。与 C++ 中的所有标识符一样,它们在运行时不再可用。也许地图或集合比枚举更适合您的用例?
编写你自己的函数来处理这个......
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("");
}