按值获取枚举关键字 我有一个关于C++枚举的基本问题。
以下是一个枚举:按值获取枚举关键字 我有一个关于C++枚举的基本问题。,c++,enums,C++,Enums,以下是一个枚举: enum Names { Tim = 0x1, Bob = 0x2, Jim = 0x4 }; 如果我收到一个值(例如0x4),我想打印相关名称:Jim 有办法吗?类似于Names.key(0x04) 谢谢 < P>不,在C++中没有办法做到这一点。首先,将枚举的名称编译出来。如果要从整数获取枚举类型,可以强制转换 类似地,如果你有 Foo foo = new Foo(); String na
enum Names {
Tim = 0x1,
Bob = 0x2,
Jim = 0x4
};
如果我收到一个值(例如0x4
),我想打印相关名称:Jim
有办法吗?类似于Names.key(0x04)
谢谢
< P>不,在C++中没有办法做到这一点。首先,将枚举的名称编译出来。如果要从整数获取枚举类型,可以强制转换 类似地,如果你有Foo foo = new Foo();
String name = "John";
int age = 23;
<>没有可获得C++中变量名的名称。< P>不,C++中没有办法。首先,将枚举的名称编译出来。如果要从整数获取枚举类型,可以强制转换 类似地,如果你有
Foo foo = new Foo();
String name = "John";
int age = 23;
<没有>在C++中获得变量名。< /P> < P>不,你不能。在java中,由于反射,C++中不存在的特性,这是可能的。p> 最好将名称存储在地图中:
std::map<Names, std::string> names_string = {
{ Tim, "Tim"},
{ Bob, "Bob"}
// .....
};
std::cout << "Tim's enum: " << names_string[Tim] << std::endl;
std::映射名称\u字符串={
{Tim,“Tim”},
{Bob,“Bob”}
// .....
};
不,你不能。在java中,由于反射,C++中不存在的特性,这是可能的。p>
最好将名称存储在地图中:
std::map<Names, std::string> names_string = {
{ Tim, "Tim"},
{ Bob, "Bob"}
// .....
};
std::cout << "Tim's enum: " << names_string[Tim] << std::endl;
std::映射名称\u字符串={
{Tim,“Tim”},
{Bob,“Bob”}
// .....
};
不,这是不可能的。与C++中的所有标识符一样,它们在运行时不再可用。也许映射或集合比枚举更适合您的用例?不,这是不可能的。与C++中的所有标识符一样,它们在运行时不再可用。也许一个地图或集合比EnUM?< P>更适合你的用例,正如很多人所说的,这在香草C++中是不可能的。但是如果您使用Qt,您可以定义注册到Qt元系统的枚举,这样您就可以在运行时检索枚举信息
QMetaEnum类提供有关枚举器的元数据
使用name()作为枚举数的名称。枚举器的键(对象的名称)
每个枚举项)由key()返回;使用keyCount()查找
钥匙的数量。isFlag()返回枚举数的含义
用作标志,表示其值可以使用
操作员或操作员
转换函数keyToValue()、valueToKey()、keysToValue(),
和valueToKeys()允许在整数表示形式之间进行转换
指枚举或集合值及其文字表示。这个
函数的作用域()返回此枚举数声明的类作用域
在
由于整个机制使用QT元系统,只能对枚举、QObjC++派生类的成员使用这种方法。
< P>正如很多人所说的,这在香草C++中是不可能的。但是如果您使用Qt,您可以定义注册到Qt元系统的枚举,这样您就可以在运行时检索枚举信息
QMetaEnum类提供有关枚举器的元数据
使用name()作为枚举数的名称。枚举器的键(对象的名称)
每个枚举项)由key()返回;使用keyCount()查找
钥匙的数量。isFlag()返回枚举数的含义
用作标志,表示其值可以使用
操作员或操作员
转换函数keyToValue()、valueToKey()、keysToValue(),
和valueToKeys()允许在整数表示形式之间进行转换
指枚举或集合值及其文字表示。这个
函数的作用域()返回此枚举数声明的类作用域
在
由于整个机制使用Qt元系统,因此只能对枚举、QObject派生类的成员使用此方法。编写自己的函数来处理此问题
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("");
}
写你自己的函数来处理这个
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("");
}
我知道java存在这种情况,但是java是一种带有反射的语言,C++不是。没有自动的方法来做这件事,你必须自己做这项工作。例如,关于如何自己做这件事,看到前面的线程给你很多选择,我知道这是用java存在的,但是java是一种带有反射的语言,C++不是。没有自动的方法可以做到这一点,你必须自己做这项工作。有关如何自己做这项工作的示例,请参阅前一个线程为你提供了大量选项,谢谢你的回复。我无法使用映射,因为此枚举是从COM接口生成的。感谢您的回复。我无法使用映射,因为此枚举是从COM接口生成的。很好!但是我想我不能从基本的enum
构建QMetaEnum
,对吗?可以,但必须使用宏将其注册到元系统。但您必须使用它来编译项目,否则在运行时无法获得访问权限。更新我的答案。很好!但是我想我不能从基本的enum
构建QMetaEnum
,对吗?可以,但必须使用宏将其注册到元系统。但您必须使用它来编译项目,否则在运行时无法获得访问权限。更新我的答案。