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,和大家一起讨论。
发表于 @ 2008年03月28日 10:31:00|评论(loading...)|编辑