一种在C++程序中实现反射的方法、存储介质及计算设备技术

技术编号:19098339 阅读:215 留言:0更新日期:2018-10-03 02:35
一种在C++程序中实现反射的方法、存储介质及计算设备,所述方法包括步骤:创建C++类的反射类,所述反射类用以保存C++类的反射信息;用宏来封装C++类的反射类,以及访问C++类的反射类中保存的C++类的反射信息。本发明专利技术的在C++程序中实现反射的方法、存储介质及计算设备,可以使C++项目支持反射,实现UE4的蓝图功能,极大地简化编辑器开发。

【技术实现步骤摘要】
一种在C++程序中实现反射的方法、存储介质及计算设备
本专利技术涉及C++
,特别是涉及一种在C++程序中实现反射的方法、存储介质及计算设备。
技术介绍
反射是程序可以访问、检测和修改其本身状态或行为的一种能力。很多语言都支持反射,有了反射,就能够让代码具有自省能力,让代码知道自己能够做什么。反射适用于如下场合:1)序列化和数据绑定;2)数据驱动,通过字符串就能够创建出类实例,通过字符串就能够访问类方法和类属性。目前java、c#等高级语言都支持反射,能否通过反射来动态获取类信息已经成为现代软件的标志之一,而c++目前是不支持反射功能的。现有技术中,在C++程序中支持反射的一种实现方式为:解析调试信息,例如,visualstudio开发的程序,可以通过解析Pdb文件获得调试信息,此种实现方式的优点在于不需要修改代码,缺点则在于必须要编译器相关的调试信息。
技术实现思路
为了解决现有技术存在的不足,本专利技术的目的在于提供一种在C++程序中实现反射的方法、存储介质及计算设备,可以使C++项目支持反射,从而实现UE4的蓝图功能,进而极大地简化编辑器开发。为实现上述目的,本专利技术提供的在C++程序中实现反射的方法,包括以下步骤:创建C++类的反射类,所述反射类用以保存C++类的反射信息;用宏来封装C++类的反射类,以及访问C++类的反射类中保存的C++类的反射信息。进一步地,所述C++类的反射信息包括:C++类的属性和函数的反射信息。进一步地,所述创建C++类的反射类的步骤是,在C++类的代码中添加预设的标志位,获得C++类的反射信息,创建C++类的反射类。所述获得C++类的反射信息的步骤进一步包括步骤:为C++类的每个属性分别设置对应的Get和Set函数,在C++类的反射信息中保存Get和Set函数指针,其中,所述Get和Set函数分别用于获取和设置C++类的属性。所述Get函数进一步用于记录C++类的属性的名字。所述获得C++类的反射信息的步骤进一步包括步骤:通过模板推导,记录C++类的函数的反射信息,其中,所述C++类的函数的反射信息,包括:函数参数个数、每个参数的数据类型、函数是否为静态函数、函数的返回值数据类型和函数指针。进一步地,所述的在C++程序中实现反射的方法,还包括步骤:通过将第三方类序列化成字符串的方式,将第三方类转换为C++类的成员变量和函数参数。所述用宏来封装C++类的反射类的步骤进一步包括步骤:用宏在C++类中,注册C++类的反射类,以及C++类的反射类中保存的C++类的反射信息。为实现上述目的,本专利技术提供的计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现本专利技术任一项所述方法的步骤。为实现上述目的,本专利技术提供的计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现本专利技术任一项所述方法的步骤。本专利技术的在C++程序中实现反射的方法、存储介质及计算设备,可以使C++项目支持反射,实现UE4的蓝图功能,极大地简化编辑器开发。本专利技术的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本专利技术而了解。附图说明附图用来提供对本专利技术的进一步理解,并且构成说明书的一部分,并与本专利技术的实施例一起,用于解释本专利技术,并不构成对本专利技术的限制。在附图中:图1为根据本专利技术的在C++程序中实现反射的方法流程图。具体实施方式以下结合附图对本专利技术的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本专利技术,并不用于限定本专利技术。图1为根据本专利技术的在C++程序中实现反射的方法流程图,下面将参考图1,对本专利技术的在C++程序中实现反射的方法进行详细描述。在步骤110,创建C++类的反射类,C++类的反射类用以保存C++类的属性、函数(方法)等的反射信息。该步骤中,在C++类的代码中添加预设的标志位,获得C++类的反射信息。例如,在Qt、UE4的C++类中,在需要反射的函数、方法前面添加预设的标志位,获得C++类的反射信息。具体而言,为C++类的每个属性分别设置对应的Get和Set函数,在C++类的反射信息中保存Get和Set函数指针,其中,Get和Set函数分别用于获取和设置C++类的属性。如程序1-1所示,通过函数指针,记录C++类的属性的名字,获取C++类的属性的设置功能。程序1-1classTest{public:voidFunc(){}intGetFlag(){returnm_nFlag;}voidSetFlag(intnFlag){m_nFlag=nFlag;}private:intm_nFlag;};以及通过模板推导,记录C++类的函数(方法)的反射信息,其中,记录的反射信息包括:函数参数个数、每个参数的数据类型、函数是否为静态函数、函数的返回值数据类型和函数指针等。如程序1-2所示,利用模板来自动推导C++类的函数参数,因此只需要注册函数名,例如代码:Reg_Func(Test,Func);程序1-2(1-1续)Reg(Test);Reg_Field(int,Test,m_nFlag,GetFlag,SetFlag);Reg_Func(Test,Func);通过模板推导,获得C++类的函数(方法)的反射信息时,如程序1-3所示,首先利用模板特化,让编译器自动匹配参数一致的函数。程序1-3为一个参数的模板偏特化的例子,并且为了避免void*,统一使用任意变量Var来存储数据。程序1-3template<class__RT,class__C,class__P1>inlineMethodType*RTTIFuncTypeOf(__RT(__C::*f)(__P1)){returnnewRTTIFuncType1<__RT,__C,__P1>(f);}template<class__RT,class__C,class__P1>classRTTIFuncType1:publicMethodType{public:typedef__RT(__C::*fptr)(__P1);fptrf;RTTIFuncType1(fptrf){//记录必须的反射信息:函数指针、返回值类型、参数个数、各个参数的类型this->f=f;m_nReturnType=TVarTraits<__RT>::Type;intnParamType=TVarTraits<__P1>::Type;m_paramsType.push_back(nParamType);}virtualvoidInvoke(void*obj,constIVarList&args,IVarList&res){//提取函数调用参数__P1p1=TVarGetter<__P1>::Get(args,0);//通过反射信息中记录的函数指针来调用函数TVarSetter<__RT>::Set(res,(((__C*)obj)->*f)本文档来自技高网...

【技术保护点】
1.一种在C++程序中实现反射的方法,其特征在于,包括以下步骤:创建C++类的反射类,所述反射类用以保存C++类的反射信息;用宏来封装C++类的反射类,以及访问C++类的反射类中保存的C++类的反射信息。

【技术特征摘要】
1.一种在C++程序中实现反射的方法,其特征在于,包括以下步骤:创建C++类的反射类,所述反射类用以保存C++类的反射信息;用宏来封装C++类的反射类,以及访问C++类的反射类中保存的C++类的反射信息。2.根据权利要求1所述的在C++程序中实现反射的方法,其特征在于,所述C++类的反射信息包括:C++类的属性和函数的反射信息。3.根据权利要求1所述的在C++程序中实现反射的方法,其特征在于,所述创建C++类的反射类的步骤是,在C++类的代码中添加预设的标志位,获得C++类的反射信息,创建C++类的反射类。4.根据权利要求3所述的在C++程序中实现反射的方法,其特征在于,所述获得C++类的反射信息的步骤进一步包括步骤:为C++类的每个属性分别设置对应的Get和Set函数,在C++类的反射信息中保存Get和Set函数指针,其中,所述Get和Set函数分别用于获取和设置C++类的属性。5.根据权利要求4所述的在C++程序中实现反射的方法,其特征在于,所述Get函数进一步用于记录C++类的属性的名字。6.根据权利要求...

【专利技术属性】
技术研发人员:孙金标申云宾王俊
申请(专利权)人:苏州蜗牛数字科技股份有限公司
类型:发明
国别省市:江苏,32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1