C++实现反射(Reflection)

来源:互联网 发布:自动接听电话软件下载 编辑:程序博客网 时间:2024/06/18 08:30

C++实现Reflection

最近1年多,我一直在琢磨和大量使用cli来开发游戏项目,.net系统的反射系统给我
的开发设计思路,带来了很大的冲击。反射真的可以从根本上,让设计思路相对传统
开发模式有很大的改变。
但是反射通常都提供在类似java等动态语言上,后来ms在.net平台上推出了一个很强
大完善的反射机制,我最近1年多的项目都是大量使用他,为我的项目开发,做出了很
多有意思的东西。但是我的victory3d的core因为效率原因,依然是采用纯C++开发,
享受不到.net平台的便利。不少人在呼吁C++标准组织,给C++添加上反射特性,但是
据我所知C++0x规范目前也就能搞一个gc什么的,对于reflection的支持,还不知道要
什么时候。
于是,我决定自己尝试实现一下在c++中,实现reflection,经过2天试验,目前基本
达成实际目标,下面是一个我的c++反射一个class的例子:

 ///<ReflectExport name="MyTestClass"/>
 class testclass : public VReflectBase
 {
 public:
  ///<ReflectExport/>
  void fun0()
  {
   return;
  }
  ///<ReflectExport/>
  int fun1(float a)
  {
   return 0;
  };
 };

 ///<ReflectExport name="MyTestClass"/>
 class testclass2 : public testclass
 {
 public:
  ///<ReflectExport/>
  float fun3(int a)
  {
   return 0;
  };
 };

 DEF_REFLECT(reflect::testclass,NullObject)

 BEGIN_REFLECT_METHOD(reflect::testclass)
  REF_METHOD0(reflect::testclass,fun0,void)
  REF_METHOD1(reflect::testclass,fun1,int,float)
 END_REFLECT_METHOD

 DEF_REFLECT(reflect::testclass2,testclass)

 BEGIN_REFLECT_METHOD(reflect::testclass2)
  REF_METHOD1(reflect::testclass2,fun3,float,int)
 END_REFLECT_METHOD

 void reflect_test()
 {
  //创建ClassType信息
  ClassExporter<reflect::testclass>::BuildClass();
  ClassExporter<reflect::testclass2>::BuildClass();

  ClassExporter<reflect::testclass>::BuildMethod();
  ClassExporter<reflect::testclass2>::BuildMethod();

  //获得testclass的ClassType
  VClassType* pp = ClassExporter<reflect::testclass>::ClassType;
  VClassType* pp2 = ClassExporter<reflect::testclass2>::ClassType;

  testclass obj;

  std::vector<ObjBase*> args;
  pp->Methods[0]->Invoke( &obj , args );

  ObjBase arg1;
  arg1.f = 1.2f;
  args.push_back(&arg1);
  pp->Methods[1]->Invoke( &obj , args );
 }

testclass和testclass2两个类,通过两段宏,就可以把反射信息倒出来,最后,通过一个
template ClassExporter类来操作classType,整体看起来,使用方便性方面和.net的基本
接近,倒出过程因为我是运行中获得,cli是编译器获得,显得复杂一点,不过这个,我们
可以通过外部工具,扫描倒出类的申明来自动产生。也就不是什么工作量了。
哈哈,以后只要我愿意,我甚至可以让自己的脚本随意call我victory3d最核心的c++任何
方法了。c++ reflection我再完善完善,就集成在victory中,并且广泛使用了,到时候,
我会将reflection部分代码完整的贴在blog,和大家一起讨论。 

原创粉丝点击