[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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值