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

来源:互联网 发布:cnc五轴编程 编辑:程序博客网 时间:2024/05/16 06:56

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

0 0
原创粉丝点击