问题主 和 @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。 性能和你手写遍历成员是一模一样的。