可变参数宏与枚举

Posted 力为

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可变参数宏与枚举相关的知识,希望对你有一定的参考价值。

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


问题:

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


基础设施

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





以上是关于可变参数宏与枚举的主要内容,如果未能解决你的问题,请参考以下文章

C语言实验7_宏与位运算

通过可变参数创建枚举?

W6-junit泛型枚举增强for可变参数反射[JavaWeb]

StringStringBufferenum枚举

(14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型

李瑞红201771010111