bitshares反射解析

  • 反射,关键在理解宏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