首页
学习
活动
专区
工具
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,

90220

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.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

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_luac++lua的注册名

1.4K30

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

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

5.2K40

我们的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

震惊,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

36410

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

8810

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.7K21

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。

47620

【游戏开发】小白学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.7K30

使用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.4K40

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

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

98110

Lua菜鸟②】数据类型

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

1.6K60

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.3K70

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

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

1.6K20

如何禁止函数值调用

代码编译运行环境:VS2012+Debug+Win32 ---- 按照参数形式的不同,C++应该有三种函数调用方式:值调用、引用调用和指针调用。...因此,要禁止值调用,就必须在的拷贝构造函数上做文章。 可以直接在拷贝构造函数中跑出异常,这样就迫使程序员不能使用拷贝构造函数,否则程序总是出现运行时错误。...但是,这不是一个好的办法,应该在编译的阶段就告诉程序员,不能使用该类的拷贝构造函数。 1.不显示定义拷贝构造函数可行吗?...&,编译无法通过,出错的信息如下:非法的复制构造函数: 第一个参数不应是“A”。...作为实参以值传递的方式传递给一个函数; c. 在函数体内返回一个对象时,也会调用返回值类型的拷贝构造函数; d. 需要产生一个临时对象时(对象作为函数返回值会创建临时对象)。

2.8K10

C++如何禁止函数值调用

代码编译运行环境:VS2017+Debug+Win32 ---- 按照参数形式的不同,C++应该有三种函数调用方式:值调用、引用调用和指针调用。...因此,要禁止值调用,就必须在的拷贝构造函数上做文章。 可以直接在拷贝构造函数中抛出异常,这样就迫使程序员不能使用拷贝构造函数,否则程序总是出现运行时错误。...但是,这不是一个好的办法,应该在编译的阶段就告诉程序员,不能使用该类的拷贝构造函数。 1.不显示定义拷贝构造函数可行吗?...&,编译无法通过,出错的信息如下:非法的复制构造函数: 第一个参数不应是“A”。...作为实参以值传递的方式传递给一个函数; c. 在函数体内返回一个对象时,也会调用返回值类型的拷贝构造函数; d. 需要产生一个临时对象时(对象作为函数返回值会创建临时对象)。

2.4K30

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

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

1.8K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券