如何在C ++中解析枚举?

时间:2014-12-13 13:06:25

标签: c++ enums

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

3 个答案:

答案 0 :(得分:2)

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

您可以创建map<string,MyEnumType>并使用枚举名称及其值填充它。您可以使用“stringize macros”来避免多次输入相同的值:

#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;
}

Demo.

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

答案 1 :(得分:1)

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

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." }
    // ...
};

答案 2 :(得分:1)

dashblinkenlight's answer的补充中,你可以玩X-macro C&amp; C ++ preprocessor技巧,如:

 // 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
 }

或者您可以使用类似的技巧来提供相当于πάντα ῥεῖ 's answer

的技巧

另请参阅this answer有关同一文件的多个#include的创造性使用情况。