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