[C++]BOOST_PP_SEQ_FOR_EACH_I根据enum值访问类的不同成员

C++中没有反射机制,所以收到一个枚举的时候想根据枚举名称调用不同的类成员/函数就很麻烦,

比如服务器传过来一个枚举enum Property{HP, MP, STR, ...},无法修改服务器端数据结构的情况下想访问Player类中的对应成员,一般情况只能

switch(property)
{
case HP:
	DoSomething(Player.HP);
	break;
case MP:
	DoSomething(Player.MP);
	break;
case STR:
	DoSomething(Player.STR);
	break;
//...
default:
	break;
}

如果有很多属性就得写很多case了。

用boost的BOOST_PP_SEQ_FOR_EACH_I可以稍微简化一下这个过程(不过相应地编译时间会变长)

#include <boost/preprocessor/seq/for_each_i.hpp>
#define PROPERTY_LIST (HP)(MP)(STR)
#define CASE_MACRO(r, data, i, elem) \
	case i:	DoSomething(Player.elem); \
	break;
switch (property)
{
    BOOST_PP_SEQ_FOR_EACH_I(CASE_MACRO, _, PROPERTY_LIST)
    default:
    break;
}

 
 


使用: BOOST_PP_SEQ_FOR_EACH_I(macro, data, seq)

其中macro对BOOST_PP_SEQ_FOR_EACH_I而言是一个固定的拥有4个参数的宏,data是展开时每项中固定不变的量(可以不用),seq是每项中变化的量. 

举例:

如果seq是 (a)(b)(c), 那么展开后的结果将是
macro(r, data, 0, a) macro(r, data, 1, b) macro(r, data, 2, c)


参考链接:

http://www.boost.org/doc/libs/1_63_0/libs/preprocessor/doc/ref/seq_for_each_i.html

猜你喜欢

转载自blog.csdn.net/tlrainty/article/details/70146847