LuaPlus学习(三)
<--!版权所有foruok,转载注明出处!-->
从lua调用C++函数和对象
利用LuaPlus可以方便的从C++中调用lua脚本,翻过也一样。通过注册函数或类对象,lua便可以访问C++。
一、C风格函数注册
Lua提供了C风格的回调函数注册,该函数原型如下:
无论是全局函数、类非虚函数、类虚函数,只要符合上面的原型,都可以向Lua注册。我们以全局函数为例,下面是我们提供的一个回调函数CStyleAddFunc:
在回调函数中,我们通过栈来访问参数,栈中可以存贮多个参数, LuaStack args(state);语句获取栈对象供后续访问。 接下来判断参数是否是数字,如果两个参数都是数字,那么进行加操作,将结果压入栈中,将压入栈中的数据的个数返回。注意,返回值代表压入栈中的元素的个数,而不是某种计算结果或其它意义的返回值。通过改变返回值来查看程序的输出,这样可以对返回值的含义有个感性的了解。 要注册回到只需调用Register函数即可,这在第一篇中已经用到。下面是测试函数:
state->DoString("ret = Add(1,5); print(ret)");该句用来从执行Lua命令串。我们先调用Add并将结果赋值给ret变量,然后打印ret的值。 main函数如下:
编译运行,一切OK。 我们也可以从Lua脚本文件中调用注册的回调函数,第一篇中有演示。 要注册类的成员函数,则需要调用Register的另一种形式Register( const char* funcName, const Callee& callee, int (Callee::*func)(LuaState*), int nupvalues = 0 ); ,提供类实例指针和函数即可完成注册。下面是示例代码:
修改一下main函数,将 TestClassMemberFuncReg()加进去就可以看效果了。
二、任意形式C++函数注册
LuaPlus提供了 RegisterDirect()
来直接注册任意形式的函数,这样更为直接,不必受限于上述的函数原型,使用起来很方便。同样此函数像Register一样,可以注册类的成员函数(也需要显示指定this指针)。下面是代码:
三、注册函子对象
上面两节的方式可以实现简单的回调注册,注册类的成员函数时需要显式提供类指针,不适合用于映射C++中的类结构。 RegisterObjectFunctor()和元表(metatable)结合,提供了一种新的方法
。我们不需要在注册函数时显式的提供this指针,作为替代,this指针可以从调用者的userdata或__object成员获取。 元表(metatable)是一个普通的表对象,它定义了一些可以被重写的操作,如add,sub,mul,index,call等,这些操作以"__"开头,如__add,__index等。加入你重写了__add,那么在执行add操作时就会调用你自己定义的__add操作。这种特性可以用来模拟C++中的类对象,注册函子对象正是利用了这种特性来实现的。 下面我们将一个C++类映射到Lua中。类代码如下:
首先我们需要生成一个元表(metatable),将C++类的成员函数注册到该元表中。然后依据CMultiObject的实例生成lua中与其对应的对象(也是表),将该对象的metatable(也即该表的__object成员)设置为之前产生的元表。最后将新生成的lua对象放置到全局作用域中,这样后面就可以直接引用这些对象。 我们可以做这样的近似理解:每个实例的数据元素存放在与已对应的lua table中,而类的成员函数则存放在metatable中(函子对象)。当调用obj1obj:Print()时,会先找到其metatable,然后在metatable中找Print()函数。 这样便实现了类似C++中的类结构。每个实例有自己的数据,而所有实例共享一份方法列表。 另外一种方式是利用表的userdata来实现,需要先创建一个lua表对象,然后将C++对象obj1设置为该表的userdata(也是设置其__object成员),再将该表对象的metatable设置为我们之前创建的元表。最后就可以用表明来调用Print函数。代码如下:
注册函子对象(RegisterObjectFunctor)这种方式的限制在于:要注册的函数必须符合原型( int Callback(LuaState * state);)。为了打破这种限制,LuaPlus提供了另外一种方式。
四、直接注册函子对象
直接注册函子对象(RegisterObjectDirect)和 RegisterDirect类似,不考虑函数原型,可以直接向元表注册任意形式的函数
。 为CMultiObject添加新的成员函数:
调用RegisterObjectDirect方法:
第二个参数 (CMultiObject * ) 0有点奇怪,这是模板参数的需要。 最后:
五、注销回调
注销回调是件简单的事情,调用SetNil("yourCallBack")即可,如:
好了,迄今为止最长的一篇,看着像是LuaPlus文档的翻译(?),不过还是加入了一些自己的理解。文档我看了下,琢磨了半天才明白。希望能快点将LuaPlus用起来。 资料: (1) Lua5.1参考手册 (2) Lua入门wiki (3)LuaPlus.html,源码包中带的。 <--!版权所有foruok,转载注明出处!-->
LuaPlus学习(三)相关推荐
- 统计学习三要素 模型+策略+算法
统计学习方法都是由模型. 策略和算法构成的. 即统计学习方法由三要素构成, 可以简单地表示为:方法=模型+策略+算法 模型 统计学习首要考虑的问题是学习什么样的模型. 在监督学习过程中, 模型就是所要 ...
- 深度学习三巨头也成了大眼萌,这个一键转换动画电影形象的网站竟因「太火」而下线...
机器之心报道 作者:魔王.杜伟 想不想在动画电影中拥有自己的角色?这个网站一键满足你的需求,不过竟因流量太大成本过高而下线. 近期热映的电影<花木兰>总是让人回想起 1998 年上映的同名 ...
- 2020届 AAAI Fellow名单新鲜出炉!!!深度学习三巨头终于齐聚
点击上方"深度学习技术前沿",选择"星标"公众号 资源干货,第一时间送达 AAAI 是国际人工智能领域最权威的学术组织,Fellow 是该学会给予会员的最高荣誉 ...
- HTTP学习三:HTTPS
HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...
- python爬虫正则表达式实例-python爬虫学习三:python正则表达式
python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...
- TweenMax动画库学习(三)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) ...
- 实至名归!ACM宣布深度学习三巨头共同获得图灵奖
昨日晚间,ACM(国际计算机学会)宣布,有"深度学习三巨头"之称的Yoshua Bengio.Yann LeCun.Geoffrey Hinton共同获得了2018年的图灵奖,这是 ...
- 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
文章首发于微信公众号<有三AI> [技术综述]图像与CNN发家简史,集齐深度学习三巨头 没有一个经典的发现会是突然之间横空出世,它总是需要一些积淀. 提起卷积神经网络,我们总会从LeNet ...
- spring security 学习三-rememberMe
spring security 学习三-rememberMe 功能:登录时的"记住我"功能 原理: rememberMeAuthenticationFilter在security过 ...
- C#多线程学习(三) 生产者和消费者
C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...
最新文章
- PHPROXY Encrypt 0.61
- 四川2020年三月计算机等级考试报名时间,四川2020年3月计算机等级考试报名时间...
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
- 通过一个具体的例子学习Threadlocal Test
- python下载网页歌词_python3个人学习笔记-批量下载分析歌词2
- 前端笔记-使用JavaScript防止空表单提交
- Netty工作笔记0083---通过自定义协议解决粘包拆包问题1
- jquery中checkbox赋值
- C# 代码注释生成代码提示和帮助文档
- ICLR'22 | 审稿结果统计速览
- Ubuntu18.04下基于YoloV4 的Keras物体识别
- 【毕设狗】【单片机毕业设计】基于单片机的红外遥控器-实物设计
- 小米Note 3完美刷成开发版获取root权限的步骤
- STM32F091不识别仿真器的案例
- 计算机毕业设计Java河南省农村多元化养老服务管理系统设计与实现(源码+系统+mysql数据库+lw文档)
- php 提取视频中的音频,如何把视频中的音频提取出来
- psp测试电池软件,PSP 电池使用时间测试
- 1926163-51-0|肽基脯氨酰异构酶底物:WFY(p)SPR-7-氨基-4-甲基香豆素
- 打乱魔方软件_一种智能魔方打乱装置的制作方法
- 青龙面板——每日自动拿京豆
热门文章
- etry error, curr request is null
- 学习笔记 -- 四元数:$v‘= qvq^{-1}$,证明v‘为虚四元数
- sklearn的make_circles和make_moons生成数据
- js获取浏览器body或窗宽度高度
- 时间选择器控件默认时间自定义
- 一种高程滤波方法去除低矮地物及地面点
- 太阳系外发现首颗适合地球生命居住星球(图)
- admi后台 vue_vue管理后台
- mysql数据库 SELECT COUNT(1) FROM new_comps WHERE deleted = 0 统计数据太慢了二十多秒
- EBAZ4205矿机摄像头扩展板