[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
- [C++]BOOST_PP_SEQ_FOR_EACH_I根据enum值访问类的不同成员
- 妙用union和enum实现只有一个数据成员的类可存储不同的类型
- 不同文件的类成员变量的访问
- 类成员的访问控制(C++)
- C++:类的成员访问权限控制
- C和C++中static、不同源文件中成员和函数的互相访问的比较
- 用不同的方法访问私有成员
- C++:private成员的访问
- C中enum类型成员的参数变化
- 访问类的成员
- C++DoModal怎样根据不同的按钮返回不同的值?
- 同一个类的不同的实例相互访问私有或者受保护的成员
- 类的两个不同实例如何相互访问对方的成员变量
- c++中,同个类的不同实例可以相互访问对方的私有、保护成员
- 访问对象的公有成员函数的不同方式
- 同一个类不同对象,可以互相访问对方的私有成员而不通过get()或set()
- 类成员和实例成员的访问
- [C#] 成员的可访问性
- VM12安装centos7安装VMare-tool后,hgfs下没有共享文件夹
- ffmpeg参数中文详细解释
- 1038. 统计同成绩学生(20)
- GCD
- 线段树求解区间值问题
- [C++]BOOST_PP_SEQ_FOR_EACH_I根据enum值访问类的不同成员
- ffmpeg常用基本命令(转)
- wordpress关于插件和主题
- Linux页框分配时,node和zone的选择
- javascript中如何去掉数组中的重复项
- Linux进程描述符:task_struct结构体
- Android中哪里使用到了反射
- Lightoj1047——Neighbor House(dp)
- JedisCluster死活连接不上集群,提示Could not get a resource from the pool