C反射深入探究function实现机

北京湿疹医院哪个好 http://pf.39.net/bdfyy/bdfal/210405/8814491.html

导语

本文将深入Function这部分进行介绍,主要内容是如何利用模板完成对C++函数的类型擦除,以及如何在运行时调用类型擦除后的函数。有的时候我们需要平衡类型擦除与性能的冲突,所以本文也会以luafunctionwrapper这种功能为例,简单介绍这部分。

在上篇《C++反射:全面解读property的实现机制!》中我们对反射中的Property实现做了相关的介绍,本篇将深入Function这部分进行介绍。

一、Function示例代码

//-------------------------------------//declaration//-------------------------------------classVector3{public:doublex;doubley;doublez;public:Vector3():x(0.0),y(0.0),z(0.0){}Vector3(double_x,double_y,double_z):x(_x),y(_y),z(_z){}doubleDotProduct(constVector3vec)const;};//-------------------------------------//registercode//-------------------------------------__register_typeVector3("Vector3").constructor().constructorReal,Real,Real().function("DotProduct",Vector3::DotProduct);//-------------------------------------//usecode//-------------------------------------auto*metaClass=__type_offramework::math::Vector3();ASSERT_TRUE(metaClass!=nullptr);autoobj=runtime::CreateWithArgs(*metaClass,Args{1.0,2.0,3.0});ASSERT_TRUE(obj!=UserObject::nothing);constreflection::Function*dotProductFunc=nullptr;metaClass-TryGetFunction("DotProduct",dotProductFunc);ASSERT_TRUE(dotProductFunc!=nullptr);math::Vector3otherVec(1.0,2.0,3.0);autodotRet=runtime::Call(*dotProductFunc,obj,otherVec);ASSERT_DOUBLE_EQ(dotRet.todouble(),14.0);(一)注册的代码

上述代码中,我们通过__register_typeT()创建的ClassBuilder提供的。function(name,func)函数来完成注册。

__register_typeVector3("Vector3").function("DotProduct",Vector3::DotProduct);

上例中我们就将Vector3::DotProduct()函数注册到MetaClass中了。

(二)使用的代码

运行时我们获取到的也是类型擦除后的Function对象,如上例中的dotProductFunc,所以运行时我们需要通过runtime命名空间下提供的辅助设施runtime::call()来完成对应函数的调用,c++的动态版函数类型擦除后的入口参数是统一的Args,出口参数是Value,runtime::call()提供了任意输入参数到Args的转换,如下所示,我们即可完成对obj对象上的DotProduct函数的调用:

autodotRet=runtime::Call(*dotProductFunc,obj,otherVec);(三)整体文章的展开思路

本篇文章的展开思路与Property那篇基本保持一致:

一些基本知识。

运行时函数的表达-Function类。

反射函数的注册。

Lua版本反射函数的实现。

反射函数的运行时分析。

二、基本知识

FunctionTraits和TypeTraits在c++11推出后都逐渐变得成熟,一个适配C++14/17的函数类型萃取库对于像反射这种库也是至关重要的,但FunctionTraits和TypeTraits本质还是依赖SIFINAE做各种类型特化和推导,属于细节非常多但真正的技巧比较少的部分,本文就直接略过对FunctionTraits和TypeTraits细节的分析推导,假定FunctionTraits和TypeTraits已经是成熟稳定的代码部分,我们基于这部分稳定代码做上层的设计编码。

另外本文主要分析函数部分的处理过程,所以主要


转载请注明:http://www.aierlanlan.com/rzfs/169.html