如何在C++中解析枚举
How can I parse an enum in C++?
我有一个错误代码的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的创造性使用。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 带有 c++ 的枚举(输入检查)
- 在 qml 中使用 Q_ENUM 和 Q_PROPERTY 作为枚举类
- 为什么 int 类型的枚举类值不能用作 int
- 在 C++ 中输出枚举类类型的向量元素