您的位置:首页 > 编程语言 > C语言/C++

C++实现反射(Reflection)

2008-03-28 10:31 489 查看
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,和大家一起讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: