Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按值获取枚举关键字 我有一个关于C++枚举的基本问题。_C++_Enums - Fatal编程技术网

按值获取枚举关键字 我有一个关于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
,对吗?可以,但必须使用宏将其注册到元系统。但您必须使用它来编译项目,否则在运行时无法获得访问权限。更新我的答案。