您可以使用std::unordered_map<std::string, Fields>
,这将加速从线时间常数时间的转换:
std::unordered_map<std::string, Fields> fieldsLookupTable {
{ "FieldFlagNone", FieldFlagNone },
...
};
为了使它更简洁,可以用一些宏:
#define LOOKUP_TABLE_ENTRY(x) { #x, x }
然后:
std::unordered_map<std::string, Fields> fieldsLookupTable {
LOOKUP_TABLE_ENTRY(FieldFlagNone),
LOOKUP_TABLE_ENTRY(FieldFlagOperation),
...
};
如果你想在消除重复方面真的硬派,哟ü可以做这样的事情:
#define ENUM_MODE_DEFINE 0
#define ENUM_MODE_LOOKUP 1
#define ENUM_BEGIN(x) \
#if ENUM_MODE == ENUM_MODE_DEFINE \
typedef enum x { \
#else \
#define LOOKUP_TABLE_NAME x ## LookupTable \
std::unordered_map<std::string, x> LOOKUP_TABLE_NAME; \
#endif
#define ENUM_ENTRY(x) \
#if ENUM_MODE == ENUM_MODE_DEFINE \
x, \
#else \
LOOKUP_TABLE_NAME[#x] = x; \
#endif
#define ENUM_END \
#if ENUM_MODE == ENUM_MODE_DEFINE \
} \
#else \
#undef LOOKUP_TABLE_NAME \
#endif
,然后定义你这样的枚举:
#define FIELDS \
ENUM_BEGIN(Fields) \
ENUM_ENTRY(FieldFlagNone) \
ENUM_ENTRY(FieldFlagOperation) \
...
ENUM_END
哪里以前有枚举的定义,现在会有这样的:
#define ENUM_MODE ENUM_MODE_DEFINE
FIELDS
和其他地方你有查询表,你说这个:
#define ENUM_MODE ENUM_MODE_LOOKUP
FIELDS
基本上,FIELDS
宏使用宏ENUM_BEGIN
,ENUM_ENTRY
和ENUM_END
宏,它们根据ENUM_MODE
的值生成不同的代码。如果将其定义为ENUM_MODE_DEFINE
,则FIELDS
将生成枚举定义。如果将其设置为ENUM_MODE_LOOKUP
,则会生成fieldsLookupTable
。 这样我们只使用了FIELDS
中的enum条目名称,所以如果您在那里更改某些内容,查找表和枚举定义将自动更改并且不会不同步。
['std :: unordered_map'](http://en.cppreference.com/w/cpp/container/unordered_map)? –
BoBTFish
这会减少代码量,谢谢。我猜测,当字符串是枚举值的精确表示时,没有办法直接查找枚举值? –