- 反射,关键在理解宏BOOST_PP_SEQ_FOR_EACH,分成以下两类
- 成员反射
- 原理:生成一个reflector<T>类,把T的成员转移到reflector<T>中,并提供visit(visitor&)接口访问,访问的时候遍列每个成员,且调用visitor.operator(const char* name)
- 应用
- variant:即可以把T转移到variant中,也可以从variant转移出来
- 序列化:pack、unpack
- 接口反射
- 原理:生成一个vtable<T,Transform>类,把T的成员函数转移到vtable<T,Transform>中,转移成成员,并提供visit(visitor&&)接口访问,访问的时候遍列每个成员,调用方法有两类,且都可以修改memb
- visitor.operator()( const char* name, std::function<R(Args…)>& memb, MemberPtr m ),memb为成员,m为vistor的类的成员函数&OtherType::elem
- visitor.operator()( const char* name, std::function<R(Args…)>& memb )
- 使用:api<interfaceT> apit(realT),
- 内部生成vtable<T,Transform>实例,使用api->访问vtable<T,Transform>的实例的“虚拟函数”
- 构造的时候,会调用visitor.operator()( const char* name, std::function<R(Args…)>& memb, MemberPtr m ),接口的真实地址变更到realT上
- 应用
- 网络RCP调用,参数和返回值需要转化成variant
- 原理:生成一个vtable<T,Transform>类,把T的成员函数转移到vtable<T,Transform>中,转移成成员,并提供visit(visitor&&)接口访问,访问的时候遍列每个成员,调用方法有两类,且都可以修改memb
- 成员反射