如何在C++中解析枚举

How can I parse an enum in C++?

本文关键字:枚举 C++      更新时间:2023-10-16

我有一个错误代码的C++枚举(其中 30 个),并且有一个函数可以在出现问题时返回错误代码。有没有办法解析枚举以检查返回了哪些错误代码并提供解释?我知道switch语句在这里可能是一种选择,但正在寻找不同的东西来避免编写大量switch语句。

不,这是不可能的:枚举常量的名称是编译时工件,它们在运行时不可用*

您可以创建一个map<string,MyEnumType>,并用枚举的名称及其值填充它。您可以使用"字符串化宏"来避免多次键入相同的值:

#include <iostream>
#include <string>
#include <map>
using namespace std;
#define ADD_ENUM_TO_MAP(m,x) m[#x]=x
enum MyEnumType {
    quick, brown, fox, jumps, over, the, lazy, dog
};
int main() {
    map<string,MyEnumType> nameToEnum;
    ADD_ENUM_TO_MAP(nameToEnum, quick);
    ADD_ENUM_TO_MAP(nameToEnum, brown);
    ADD_ENUM_TO_MAP(nameToEnum, fox);
    ADD_ENUM_TO_MAP(nameToEnum, jumps);
    ADD_ENUM_TO_MAP(nameToEnum, over);
    ADD_ENUM_TO_MAP(nameToEnum, the);
    ADD_ENUM_TO_MAP(nameToEnum, lazy);
    ADD_ENUM_TO_MAP(nameToEnum, dog);
    cout << nameToEnum["fox"] << endl;
    return 0;
}

演示。

* 调试器通过编译器提供的符号表获取此信息。

你可以做的是提供一个地图(正如我在评论中提到的):

enum ErrorCodes {
    OK ,
    ERR_FILE_OPEN ,
    ERR_MISSING_INPUT ,
    // ...
}
std::map<ErrorCodes,std::string> codeTranslationMap {
     { OK, "OK" }
     { ERR_FILE_OPEN , "File open failed." }
     { ERR_MISSING_INPUT , "Missing input." }
    // ...
};

作为dashblinkenlight答案的补充,你可以玩X宏C&C++预处理器技巧,例如:

 // your list of enumerators applied to a preprocessor macro:
 #define ENUM_LIST(P) 
    P(ERR_NONE,"no errors") 
    P(ERR_FILE_OPEN,"file open") 
    P(MISSING_INPUT,"missing input")

然后,您将首先使用以下方法定义枚举:

 #define ENUM_DEFINE(Nam,Str) Nam,
 enum error_en {
    ENUM_LIST(ENUM_DEFINE)
 };
 #undef ENUM_DEFINE

然后定义打印,例如

 void out(enum error_en e) {
   switch(e) {
 #define ENUM_OUT(Nam,Str) case Nam: cout << Str; break;
 ENUM_LIST(ENUM_OUT)
 #undef ENUM_OUT
    } // end switch
 }

或者你可以玩类似的技巧来提供相当于πάντα ῥεῖ的答案

另请参阅此答案,了解同一文件的多个#include-s的创造性使用。