首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c++反射深入浅出 - 基于反射的Lua中间层实现

本篇中, 我们将以lura库为例(笔者之前项目使用的Lua的 bridge实现), 介绍如何以C++反射作为基础设施, 以更简洁的方式来实现一版lua的bridge....C++类到Lua中使用, 基本都要完成如下图所示的几项功能: 1.1 函数的处理 不管是 "member functions" 或者是 "static functions"的处理, 在bridge...c++函数向lua注册的核心目的只有一个: 将需要在lua中调用的c++函数, 转换为 统一类型的lua c function....剩下的调用过程就比较简单了, 正确填入参数, 我们即可以像一个标准的lua函数那样使用这些c++函数了....__call 用于直接在lua中构造一个对应的c++对象, 我们将class table作为自己的meta table设置后, 也会将这个meta table暴露到_G上, 如上例中的Vector3,

97320

C++反射:全方位解读Lura库的前世今生!

一、lua bridge核心功能概述 Lua的bridge层实现比较核心的功能是导出C++类到Lua中使用,基本都要完成如下图所示的几项功能: (一)函数的处理 不管是“member functions...c++函数向lua注册的核心目的只有一个: 将需要在lua中调用的c++函数,转换为统一类型的lua c function。...剩下的调用过程就比较简单了,正确填入参数,我们即可以像一个标准的lua函数那样使用这些c++函数了。...(一)lura核心机制简述 lura整体的代码因为各种实际项目需求,还是比较多的,不过核心机制相关的代码比较简单,上图中像: 静态类成员访问 成员函数访问 成员变量访问 这几个功能都是由两个特定构造的...c++函数StaticMemberMetaIndex()函数上 __call用于直接在lua中构造一个对应的c++对象,我们将class table作为自己的meta table设置后,也会将这个meta

1.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c++反射深入浅出 - 4.基于反射的Lua中间层实现

    本篇中, 我们将以lura库为例(笔者之前项目使用的Lua的 bridge实现), 介绍如何以C++反射作为基础设施, 以更简洁的方式来实现一版lua的bridge....C++类到Lua中使用, 基本都要完成如下图所示的几项功能: 1.1 函数的处理 不管是 "member functions" 或者是 "static functions"的处理, 在bridge...c++函数向lua注册的核心目的只有一个: 将需要在lua中调用的c++函数, 转换为 统一类型的lua c function....剩下的调用过程就比较简单了, 正确填入参数, 我们即可以像一个标准的lua函数那样使用这些c++函数了....__call 用于直接在lua中构造一个对应的c++对象, 我们将class table作为自己的meta table设置后, 也会将这个meta table暴露到_G上, 如上例中的Vector3,

    1.1K10

    C++与lua的结合,LuaBridge的使用

    LuaBridge介绍 LuaBridge 是一个简单好用的轻量级且无依赖的库,用于在C ++和 LUA(一种强大,快速,轻量级,可嵌入的脚本语言)之间来回映射数据,函数和类。...C++和脚本结合使用是非常好的实践,这种用法提供了非常大的灵活度和自由空间。 脚本文件能够作配置文件和编写复杂的函数。更重要的一点是修改脚本文件后无需重新编译,它帮你提高效率。...LuaBridge环境准备 luaBridge的使用简单,只需要把luaBridge的一堆头文件目录拷贝进项目包含进去使用。 但是需要提前准备好lua.lib,项目打包生成可执行exe时需要链接它。... ()//无参构造函数的注册 .addData("test_str",&test_lua::m_test_string)//注册变量到lua .addStaticData...属性name test_lua.name="name_property"; print("name: "..test_lua.name); --lua调用c++方法test_lua为c++类在lua的注册名

    1.6K30

    我们的Lua类绑定机制

    再加上服务器的lua脚本会比较轻量级,索性就用一个简单高效的Lua绑定机制。 即便如此,本来的第一选择是去找了个好像叫LuaBridge的项目。...另外就是lua里保存C++对象一定要把metatable设成预定义好的元表。为了保存C++的成员函数,静态函数。...在这个函数里,使用了一些小技巧把Lua传入的参数按C++函数的参数次序导出转换并调用这个函数指针。...C++和Lua的数据类型转换 上面有提到*利用C++模板推导的规则定制不同的类型转换函数*,实际上我们除了有把数据从Lua导出来传给C++函数以外还有从把C++数据传给Lua,所以除了上面提到的unwraper_var...LUA_BIND_OBJECT这个宏会定义一个函数和一个statis的全局变量,因为全局变量的启动规则是程序启动后,进入main函数前,为了保证一些前置数据有效,我们在这个全局变量的构造函数内把这个函数指针添加到

    2.4K10

    SWIG 官方文档第四部分 - 机翻中文人肉修正

    为了使用像 libffi 这样的库,您需要了解 C++ ABI 的底层调用约定和详细信息。例如,详细说明这是如何传递给成员函数以及可能用于传递附加信息的任何隐藏参数。...• 522.不推荐在 %extend 中使用非法的构造函数名称“ name ”,构造函数名称应为“ name ”。...以前,当在模块初始化期间将类导出到 Lua 时,对于每个派生类,所有服务表 ST(即“.fn”)都被压缩并添加到相应的派生类 ST 中:类 Base 的.fn表中的所有内容都被复制到.fn类派生表等。...第二种更直观的方法是将 Lua 表直接传递给函数,并让 SWIG 在 Lua 表和 C 数组之间自动转换。在 文件中,有已准备好的类型映射来执行此任务。...注意:不透明结构(如 FILE*)和普通包装类/结构都使用相同的“swig_lua_userdata”结构。尽管不透明结构没有附加元表,或者在解释器完成它们后如何处理它们的任何信息。

    5.4K40

    震惊,Java+ lua = 王炸

    可以将 Lua function 作为参数传递给 Java,并让 Java 保存 Lua function 的引用 可以从 Java 调用 Lua 的全局函数,或者调用引用指向的 Lua function...整理出来就是如下几点 查找并调用指定的 Java 方法 检查调用结果,并从 Java 方法获取返回值 将 Lua function 作为参数传递给 Java 方法 在 Java 方法中调用 Lua function...当一个 Lua function 传递给 Java 时,这个 function 对应的值会被存在引用表中,并获得一个唯一的引用 ID (整数)。...('data from java is:'..str) return 'haha' end 然后,Java先载入login.lua脚本并编译,然后再获取指定名称的函数,无参的直接使用call...toString(); //打印lua函数回传的数据 Logger.info("data return from lua is:"+data); 运行结果如下: hello data from

    38310

    Java 与 lua 互相调用简单教程!

    可以将 Lua function 作为参数传递给 Java,并让 Java 保存 Lua function 的引用 可以从 Java 调用 Lua 的全局函数,或者调用引用指向的 Lua function...整理出来就是如下几点 查找并调用指定的 Java 方法 检查调用结果,并从 Java 方法获取返回值 将 Lua function 作为参数传递给 Java 方法 在 Java 方法中调用 Lua function...当一个 Lua function 传递给 Java 时,这个 function 对应的值会被存在引用表中,并获得一个唯一的引用 ID (整数)。...print('data from java is:'..str) return 'haha' end 然后,Java先载入login.lua脚本并编译,然后再获取指定名称的函数,无参的直接使用...toString(); //打印lua函数回传的数据 Logger.info("data return from lua is:"+data); 运行结果如下: hello data from

    49010

    Lua学习笔记:实现一个Lua Class生成器

    表的简单使用可参考 :Lua学习笔记:Lua里table表的使用例及介绍元表的简单使用可参考:Lua学习笔记:Lua里metatable元表的使用而熟悉Lua表和元表的都知道,通过元表的 __index...字段可以让表 t 获得一些本身没有的字段, 通过这样的一个形式,我们就可以达到从实例中调用类的方法,这样我们就可以把Lua的元表比作C++中的纯虚类,通过把Lua的元表当做一个普通表的 方法类,去实现...return tab end return classend-- 定义一个类 可以看做C++中的类继承纯虚类local C1 = Class("C1")-- 构造函数ctor具体实现function...以下提供一个无库函数使用的简单Lua Class实现使用例。...Tips:一般最好自己实现一个__gc字符段对应的析构函数,这样方便释放在C/C++创造的一些内存使用,毕竟Lua只会释放自己的内存使用,C/C++层面的内存使用需要自己释放。

    9520

    Java与lua互相调用简单教程

    可以将 Lua function 作为参数传递给 Java,并让 Java 保存 Lua function 的引用 可以从 Java 调用 Lua 的全局函数,或者调用引用指向的 Lua function...整理出来就是如下几点 查找并调用指定的 Java 方法 检查调用结果,并从 Java 方法获取返回值 将 Lua function 作为参数传递给 Java 方法 在 Java 方法中调用 Lua function...当一个 Lua function 传递给 Java 时,这个 function 对应的值会被存在引用表中,并获得一个唯一的引用 ID (整数)。...print('data from java is:'..str)       return 'haha'    end 然后,Java先载入login.lua脚本并编译,然后再获取指定名称的函数,无参的直接使用...toString();    //打印lua函数回传的数据    Logger.info("data return from lua is:"+data); 运行结果如下: hello data from

    1.9K21

    Lua面向对象编程的基本原理示例

    目录 一些废话 测试代码 代码说明 基类(父类) A 派生类(子类) B 子类对象操作私有变量 继续往下继承 别人的经验,我们的阶梯! 一些废话 Lua语言是一个小而美的语言,使用者不多。...这篇文章主要描述:在Lua语言中,如何通过table结构来实现面向对象编程。...4-9行:定义父类A的成员变量和函数(按照C++中的习惯,可以叫做方法),可以看出Lua语言中的函数是“一等公民”,是可以赋值给一个变量的。...11-16行:相当于是构造函数,用来创建一个父类A的对象。 18-20行:给父类A增加一个函数,待会在分析子类B的时候再说。 22行:调用A:new()函数,创建一个类A的对象,赋值给变量objA。...因为函数的调用方式是A:new(),Lua的语法糖会把A作为第一个参数传递给new()函数的第一个隐藏参数self。

    54020

    【游戏开发】小白学Lua(上)

    在很多游戏中,脚本语言是不可或缺的一部分,很多游戏都使用到了Lua,js,python一类的脚本,脚本语言可以在很多方面给开发进程带来帮助。...通过将#include 和 extern "C"一起使用就可以解决了。 //包含lua库。...Lua库中的每一个函数的调用都需要把lua_State的指针作为一个参数传递给那个函数,因此在运行一个Lua脚本文件之前,必须通过lua_open来创建一个Lua State。...(5)Function函数     和C/C++不同,在Lua中,函数也是一种类型,也可以赋值给一个变量。因此通过使用那个变量的名字,你就可以调用那个函数。...下篇我们将共同学习Lua和C/C++的接口,以及Lua如何应用在Cocos2d-X和Unity引擎中。

    1.8K30

    Lua学习笔记:在Lua中调用CC++函数示例

    前文须知Lua的VS安装参考此文:本文会通过一些示例展示如何用lua调用C/C++传递过来的函数,并辅以部分解释语句:Lua中调用C/C++函数简介:任何在Lua中注册的C函数必须有同样的原型,typedef...表间接地将函数注册到全局环境中lua_pushcfunction到栈里再通过lua_setglobal取出注册到_G表里或者通过使用lua_rawsetfield /lua_setfield注册到特定的表里...(这里是1)return 1;}//AdapterFuncToLua 将类成员函数转变为lua_CFunction的形式供lua使用int main(){// 创建一个虚拟机lua_State* L =...);// 加载lua文件并执行luaL_dofile(L, "Test9.lua");// 关闭虚拟机lua_close(L);return 0;}这里的关键是使用相应的函数来将C++中的类成员函数转换为...0;}创建表注册函数到表中:首先使用lua_pushcfunction()将函数压入栈中,然后使用lua_setfield()将函数添加到表中。

    28620

    使用UE4UE5的stat监控Lua的性能

    stat是虚幻引擎提供的性能统计和优化工具,比较类似于Unity的Profiler,通过在代码中埋指定的函数或宏,就可以将需要的信息监控起来。...前面会简单介绍在C++中怎么用,以及stat实现原理,后面会介绍怎样在Lua中使用。如果对stat很了解了,只想看Lua使用方法,可以翻到最后。...我们查看源码: 可以看到,就是构造的时候Start,析构的时候Stop,因此在函数局部代码块里定义一个这个类的对象,当出了作用域就会析构,自然的就记录的开始和结束的时间。...因此C++提供的这些宏,在Lua中就完全用不了了,即使硬着头皮先定义好,但在lua中统计性能还得让C++不停的编译,就变成了一个非常麻烦的事情,也失去了使用Lua来高效开发的意义。...,所以我就包装了几个和stat宏差不多的: 对于统计来说,lua不像CycleCounter有构造函数和析构函数,那么我们就只能给lua中封装两个函数Start和Stop,让lua手动调用(也很方便,

    2.8K40

    C 语言实现面向对象第一步--对象模型

    本文仅仅是想讨论下在 C 中如何实现封装、继承、多态。 封装可以借助 struct,将数据和方法都放到一个结构体内,使用者可以无需关注具体的实现。...我们需要一个创建对象和回收资源的方法,可以抄抄 C++ 的作业,C++ 中构造对象使用的是new运算符,new运算符完成了 内存分配 + 调用类构造函数两件事。...这种方法显然不合适,每个对象应该知道怎么构造自己以及如何析构,也就是类型信息应该自带构造和析构函数。...所以设计了一个 Class 类,Class 类包含类的元信息,比如类的大小(分配内存时会用)、构造、析构函数等。 其它所有的类都继承自这个类。..._String 变量取地址赋值给定义在 string.h 的 StringNew // StringNew 就相当于构造字符串的类模板了,以后需要将这个指针传递给 new 函数 const void *

    1K10

    【Lua菜鸟②】数据类型

    在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。...在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字: ?...table(表) 在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表: ?...function(函数) 在 Lua 中,函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里: ?...userdata(自定义类型) userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和

    1.7K60

    FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器

    Lua的扩展也非常的容易,将C++是对象、函数导入到lua中会涉及到一些技巧,如果纯粹使用lua CAPI会稍显繁杂,幸运的是一些第三方库简化了这些操作,而FFLUA绝对是最好用的之一。...无论如何,从C++角度讲,当你嵌入lua调用lua函数时,你总希望lua的使用方式跟C++越像越好,你不希望繁复的处理调用函数的参数问题,比如C++数据转换成lua能处理的数据,即无趣又容易出错。...那么做到如何lua才算像C++,C++做到如何才算像lua呢?我们知道二者毕竟相差甚远,我们只需要把常见的操作封装成一直即可,不常见操作则特殊处理。...通过范型的C++封装,可以将C++ STL完美的转换成luatable,同时在lua返回table的时候,自动根据返回值类型将lua的table转换成C++ STL。...注册基类函数, ctor() 为构造函数的类型 fflua_register_t(ls, "base_t") //!

    2.4K70

    【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数

    了解拷贝构造函数的概念、作用、特点、规则、默认行为以及如何自定义实现,对于编写健壮和高效的C++程序至关重要。...参数传递:拷贝构造函数的参数是常量引用(const ClassName&),避免不必要的拷贝,同时防止对象在拷贝过程中被修改。 拷贝构造函数的参数必须是类类型对象的引用,而不是传值方式。...主要是因为: 避免无限递归 如果拷贝构造函数的参数是传值方式,那么在调用拷贝构造函数时,编译器会尝试创建一个临时对象来传递给该函数。这个临时对象的创建又会调用拷贝构造函数,从而导致无限递归。...触发拷贝函数自动调用的情况: 1.对象初始化: 使用另一个同类型的对象来初始化一个新对象时。...Tips: 如果⼀个类显式实现了析构并释放资源,那么他就 需要显式写拷贝构造,否则就不需要 以下是一个包含动态分配内存的类的示例,展示如何自定义拷贝构造函数: #include

    11910

    C++抛出异常与传递参数的区别

    该拷贝构造函数是对象的静态类型(static type)所对应的类的拷贝构造函数,而不是对象的动态类型(dynamic type)对应类的拷贝构造函数。 考察如下程序。...把一个SpecialStuff类型的对象当做Stuff类型的对象使用。当localStuff被抛出时,抛出的类型是Stuff类型,因此需要调用Stuff的拷贝构造函数产生对象。...在catch中捕获的是异常对象的引用,所以拷贝构造函数构造的Stuff对象与在catch块中使用的对象w是同一个对象,因为他们具有相同的地址0x0022F738。...这是因为localStuff通过拷贝构造函数传递给异常对象,而异常对象又通过拷贝构造函数传递给catch子句中的对象w。...并且调用的拷贝构造函数是属于被抛出对象的静态类型。当通过传值方式捕获时,对象被拷贝了两次。

    1.6K20
    领券