我正在使用的一些库头文件中有一堆枚举类型,我想要一种将枚举值转换为用户字符串的方法 - 反之亦然。
RTTI 不会为我这样做,因为“用户字符串”需要比枚举更具可读性。
蛮力解决方案将是一堆这样的函数,但我觉得这有点太像 C 了。
enum MyEnum {VAL1, VAL2,VAL3};
String getStringFromEnum(MyEnum e)
{
switch e
{
case VAL1: return "Value 1";
case VAL2: return "Value 2";
case VAL1: return "Value 3";
default: throw Exception("Bad MyEnum");
}
}
我有一种直觉,认为有一个使用模板的优雅解决方案,但我还不能完全理解它。
更新: 感谢您的建议-我应该明确说明枚举是在第三方库标头中定义的,所以我不想更改它们的定义。
我现在的直觉是避免使用模板并执行以下操作:
char * MyGetValue(int v, char *tmp); // implementation is trivial
#define ENUM_MAP(type, strings) char * getStringValue(const type &T) \
{ \
return MyGetValue((int)T, strings); \
}
; enum eee {AA,BB,CC}; - exists in library header file
; enum fff {DD,GG,HH};
ENUM_MAP(eee,"AA|BB|CC")
ENUM_MAP(fff,"DD|GG|HH")
// To use...
eee e;
fff f;
std::cout<< getStringValue(e);
std::cout<< getStringValue(f);
原文由 Roddy 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是我的解决方案,我参考了其他一些设计,但我的更完整和使用更简单。
你可以像这样使用它:
我有一个 github 要点。