可变参数的宏与枚举结合会产生什么样子的火花?
问题:
有时候定义了枚举需要知道枚举值对应的字符串表达,有点像反射的机制。该如何简洁的实现而又不容易出错?
基础设施
#define ENUM_ENTRY(NAME, VALUE) NAME = VALUE,
#define TOSTRING(ARG) #ARG
#define ENUM_STR_ENTRY(NAME, VALUE) \
case VALUE: { \
return TOSTRING(NAME); \
} break;
#define ENUM_ENUMERATION(NAME, ITEM_LIST)\
struct NAME##EnumDef{\
enum Enum { ITEM_LIST(ENUM_ENTRY) };\
static std::string ToString(const Enum& value) {\
switch (value) {\
ITEM_LIST(ENUM_STR_ENTRY); \
default: { throw std::exception("Invalid Enum"); } break;\
} \
}\
};
应用:
#define PEOPLE_ITEMS(ITEM_DEF, ...)\
ITEM_DEF(Name, 1)\
ITEM_DEF(Born, 2)\
ITEM_DEF(Nation, 3)
ENUM_ENUMERATION(People, PEOPLE_ITEMS)
int main()
{
PeopleEnumDef::Enum val = PeopleEnumDef::Nation;
std::cout << PeopleEnumDef::ToString(val);
return 0;
}