gpt4 book ai didi

c++ - 根据字符串表示设置枚举值

转载 作者:行者123 更新时间:2023-11-28 02:13:15 32 4
gpt4 key购买 nike

我有一个包含枚举字符串表示的配置文件。有很多不同的枚举值。加载配置后,我需要从它的字符串表示中计算出枚举值。忽略宏,我能想到的唯一方法是创建一个可怕的查找函数,对每个可能的值进行字符串比较。像这样的东西:

typedef enum Fields
{
FieldFlagNone,
FieldFlagOperation,
FieldFlagFormat,
...
}


Fields getFieldEnum(string fieldName){
if( fieldName.compare("FieldFlagNone") == 0 ){
return FieldFlagNone;
}else if( fieldName.compare("FieldFlagOperation") == 0 ){
return FieldFlagOperation;
}else if( fieldName.compare("FieldFlagFormat") == 0 ){
return FieldFlagFormat;
...
}

是否有更快或更简洁的方法来实现预期结果?

最佳答案

您可以使用 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_ENTRYENUM_END宏,根据 ENUM_MODE 的值生成不同的代码.如果将其定义为 ENUM_MODE_DEFINE , 然后 FIELDS将生成枚举定义。如果将其设置为 ENUM_MODE_LOOKUP ,它会生成 fieldsLookupTable .这样我们只使用了 FIELDS 中的枚举条目名称。 ,因此如果您在那里更改某些内容,查找表和枚举定义将自动更改并且不会不同步。

关于c++ - 根据字符串表示设置枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34945608/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com