可变参数的宏与枚举结合会产生什么样子的火花?
问题:
有时候定义了枚举需要知道枚举值对应的字符串表达,有点像反射的机制。该如何简洁的实现而又不容易出错?
基础设施
#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; }