c++ so 反射_c++如何实现反射功能?

问题主 和 @vczh 可以看下我这样弄,是否符合要求?

定义类的时候稍微傻一点,但是他既不要求pod, 也没有什么侵入式的基类要求。甚至还允许你把成员定义成private的。连C++11都不需要。

struct test_type0{

DEF_FIELD_BEGIN(test_type0)

private:

DEF_FIELD(int, x)

public:

DEF_FIELD(std::string, y)

DEF_FIELD_END

};

struct test_type1{

DEF_FIELD_BEGIN(test_type1)

DEF_FIELD(test_type0, z)

DEF_FIELD(std::string, w)

DEF_FIELD_END

};

然后就可以用functor去遍历这些类实例的成员了。目前支持仅传成员,传成员+成员的名字,传成员+成员的名字+成员的深度(这样就可以把结构体转换成json或者xml了)3种参数类型的functor。例子里头有详细的介绍。

容器类型怎么办?。。肯定在你functor里面自己遍历啦,容器自己都是支持遍历的嘛,好傻的问题咯。

核心技术其实就是如何给成员计数,如何把成员转换成整数吧。用了一个过去boost::typeof的技巧。

为了你这个问题,我牺牲了午睡给你写了个github项目(其实主要是把我另外一个项目里面的部分功能给抽离了出来yuanzhubi/raw_buffer),问题主你看是否该给我点个赞?完全不需要什么CLR来支持。

除了没法支持遍历父类的数据成员之外,应该是足够了。你看下测试用例 是否已经覆盖够了你的要求。目前就支持深度优先遍历。

通过gcc4.5, vs2008测试。 header only, C++03 only。 性能和你手写遍历成员是一模一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值