可变参数宏与枚举

来源:互联网 发布:windows7编程32 编辑:程序博客网 时间:2024/05/17 06:56

可变参数的宏与枚举结合会产生什么样子的火花?


问题:

有时候定义了枚举需要知道枚举值对应的字符串表达,有点像反射的机制。该如何简洁的实现而又不容易出错?


基础设施

#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;}




0 0
原创粉丝点击