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,和大家一起讨论。
- 【C#】反射(Reflection)
- C++实现反射(Reflection)
- C++实现反射(Reflection)
- Reflection(反射)[C#]
- C++ Reflection 的简单实现 (反射)
- 反射(Reflection)
- 反射(Reflection)机制
- Java反射(Reflection)
- 反射(Reflection)
- 反射(Reflection)
- 反射(Reflection)
- 反射(Reflection)
- 反射(Reflection)基础
- 反射(Reflection)基础知识
- 反射机制(Reflection)
- C# 反射(Reflection)
- C# 反射(Reflection)
- C# 反射(Reflection)
- 用Datatable向数据库中添加信息
- 使用RTX增加Windows XP/2000/XP Embedded系统的硬实时特性
- 售前是怎样炼成的
- 售前的能力梯次培养
- ASP.NET 安全认证(转自:寒羽枫cityhunter172)
- C++实现反射(Reflection)
- Sql Server中isnull的使用(转自:它处)
- 35种网站常用Javascript技巧
- 对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成
- FSO 遍历文件夹,按时间排序,可以删除
- 销售基础培训课程
- 如何从优秀的程序员成为伟大的程序员
- asp.net无刷新三级联动
- 构建你自己的SMS服务器