从 Lua 调用活动程序中的 C++ 函数

2023-12-01

我不确定我的问题是否有意义,但我当然知道从谷歌获得结果几乎是不可能的。首先,我做什么not想。我不想调用一些打印“hello world”或将两个数字相加的函数,我想从 C++ 程序加载 Lua 脚本,但允许脚本使用函数修改 C++ 程序的变量。例如,假设我有一个这样的 C++ 程序:

class Foo
{
    private:
        int number = 0;

    public:
        void setNumber(const int& newNumber) {number = newNumber;}
}

int main()
{
    Foo foo;

    //Load and execute Lua script, with foo object

    return 0;
}

我怎样才能让Lua脚本做foo.setNumber()(最好没有foo.)?这可能是一个很简单的问题,但是正如上面提到的,Google 上几乎所有的信息当搜索“从 Lua 调用 C++ 函数”时假设没有程序,只有一个 .cpp/hpp 文件,其中包含您要调用的一些函数。

我使用的是 Linux (Ubuntu),但该程序需要在所有平台(Windows 和 Mac)上编译


这里经常有人问这个问题。

要滚动您自己的绑定,您应该:

  1. 完全掌握 Lua 元表。
  2. 阅读Lua 编程有关 C API 的内容,特别是有关类的部分。或者,您可以阅读手册、阅读源代码(尤其是 API 标头)并进行一些谷歌搜索,但这本书可能会节省您一些时间。

概括地说,您可以通过创建包含指向类实例的指针的 Lua“用户数据”并将其传递给 Lua 脚本来向 Lua 公开 C++ 类实例。 userdata 是一种不透明类型; Lua 脚本实际上不能用它做任何事情(除了传递它),除非你给它一个元表。至少你必须实施__index用户数据上的元方法,它允许您的 C++ 代码拦截对用户数据进行索引的尝试并返回有意义的内容,并且__gc元方法,它允许您的 C++ 代码在相应的 Lua 用户数据被垃圾收集时删除公开的 C++ 对象。

例如,您创建一个名为的函数createFoo这创建了一个Foo实例,将指针包装为用户数据,应用元表实现__index并将其返回给 Lua 脚本。

当用户运行时foo.setNumber,你的C++__index使用用户数据和字符串“setNumber”调用元方法。返回什么由您决定,这决定了什么foo.setNumber在 Lua 脚本中求值为 。你要foo.setNumber评估为lua_CFunction它期望一个Foouserdata 作为它的第一个参数,这样你的类方法就可以从 Lua 中惯用地调用(即foo:setNumber(12),这是语法糖foo.setNumber(foo, 12)).

这是一个非常低级别的手动过程,一旦您掌握了它,您最终将创建一个库/模板/宏来为您做样板。那时您可能想要评估无数C++ 绑定库存在的。然而,感谢抽象泄漏定律首先学习手动执行此操作是一个非常好的主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Lua 调用活动程序中的 C++ 函数 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • if 语句中的 getline

    从我读到的来看 getline 在布尔上下文中使用会返回隐式转换为void 我在网络上没有找到任何真正引用此声明的地方 它到处都说隐式转换不存在 并且在布尔上下文中指针应该是相同类型的 并且如果ptr 0 than 0转换为指针类型ptr
  • 检查嵌套字典内的成员资格

    这是此问题的后续问题 Python DictReader 跳过缺少列的行 事实证明我很愚蠢 并且使用了错误的 ID 字段 顺便说一句 我在这里使用的是 Python 3 x 我有一个员工字典 由字符串 directory id 索引 每个值
  • 获取Xamarin图库图像的路径?

    我正在尝试获取图库图像的路径 我正在获取存储在内部存储中但不是外部存储中的图像的路径 我还启用了已授予的读写存储和相机访问权限 这是我的代码 void ChoosePhoto try var imageIntent new Intent i
  • PHP 不区分大小写的 in_array 函数

    使用时是否可以进行不区分大小写的比较in array功能 因此 使用这样的源数组 a array one two three four 以下查找都将返回 true in array one a in array two a in array
  • NHaml 可以用作通用模板引擎吗? (MVC 之外)

    我见过很多人喜欢在 ASP NET MVC 中使用 NHaml 视图引擎 但我想知道 NHaml 是否可以用作 NET 中的通用模板引擎 我想在 ASP MVC 视图引擎环境之外从控制台应用程序使用 NHaml 或者生成 HTML 电子邮件
  • VS2012 - 服务器/数据库资源管理器中未显示“创建表”或“显示表数据”菜单选项[重复]

    这个问题在这里已经有答案了 可能的重复 让 Sql Server Data Tools 与 Visual Studio 2012 Express 候选版一起使用 我已经安装了 VS 2012 for Web 和 SQL Server 201
  • 正则表达式:匹配除特定模式之外的所有内容

    我需要一个能够匹配所有内容的正则表达式but以特定模式开头的字符串 具体而言index php以及接下来的内容 例如index php id 2342343 正则表达式 匹配所有内容but a string starting with a
  • laravel Eloquent ORM 多表插入

    我如何使用 laravel Eloquent ORM 关系发出单个请求来插入多个表 表1 用户 id name email 表 2 职位 id user id content 表 3 图像 id user id post id 图片名称 关
  • 在 powershell 中复制文件同时保留文件夹结构的正确方法是什么?

    我似乎永远无法把这件事做好 我有一个现有的文件夹c MyApps Websites MySite已经有一个正在运行的现有网站 我已经下载了位于以下的最新版本c temp MySite artifacts 当我尝试运行这个时 source c
  • 一个人的补足是一个现实世界的问题,还是一个历史问题?

    另一个问题询问如何确定 C 中的奇数 偶数 并且惯用的 x 1 方法被正确标记为损坏基于补语的C 标准允许的系统 系统真的存在于计算机博物馆之外的 现实世界 中吗 我从 20 世纪 70 年代就开始编码 而且我很确定我从未遇到过这样的野兽
  • 接到来电时如何调用活动。

    大家好 我想在默认来电活动上调用我自己的活动 我已经使用广播接收器完成了此操作 我在接到来电时调用我的活动 但当我第二次接到来电时 它第一次工作正常 然后默认来电活动将超过我的活动 我不知道问题是什么 有人可以帮助我吗 显现
  • 动态改变Android Listview的高度

    我的 XML 文件的格式如下 LinearLayout ScrollView RelativeLayout LinearLayout
  • navigator.share(Web Share api)共享React App文本,而不是我放置的文本

    我正在使用 React 不是 React Native 并且尝试使用 Web Share Api 通过我的应用程序共享一些文本和 url 但是 当我打开任何要共享的应用程序时 它会从我放置的文本更改为 React 本地开发的默认文本 是的
  • 无法在 Firefox WebDriver 上获取控制台日志

    我使用的是 Firefox 版本 53 Geckodriver 版本 0 16 selenium 版本 3 4 我想获取 webdriver 的控制台日志 from selenium import webdriver from seleni
  • iPhone 音频会话属性

    我正在开发一个应用程序 它应该具有以下有关音频的属性 可以同时录制和播放声音 可以将音频输出与其他应用程序混合 例如iPod 未插入耳机时扬声器音频输出 插入耳机时音频输出 我使用了以下代码 AVAudioSession audioSess
  • 将所有 Excel 加载项模块导出到 .bas 文件的最快方法是什么?

    我正在开发一个包含许多模块的大型 Excel 插件 我需要将它们导出到 bas 文件以使用 SVN 管理它们 我知道快速导出它们的热键 Ctrl E 但我的模块数量太多 我仍然浪费了太多时间来导出它们 有谁知道更快的方法来做到这一点 这是一
  • 从内存流复制时显示 Windows 文件复制对话框?

    我的应用程序将从 MemoryStream 将文件写入磁盘 我不想创建自己的进度对话框 而是喜欢使用现有的 Windows 功能 例如SHFileOperation Win32 API 显示带有动画和进度条的标准文件复制对话框 但是 此特定
  • Codeigniter:无法访问样式表

    我的 Codeigniter 文件夹的目录结构如下 你可以看到我已经把我所有的资产都放到了assets应用程序根目录下的文件夹 基本 URL 定义为 config base url http kamran dev Codeigniter a
  • 如何使用 Knit 将 .Rmd 文件中的每个块提取到多个 .R 文件

    我们可以将 Rmd 文件 purl 为 R 文件 但是如何将 Rmd 文件中的每个块 purl 为单独的由块标签命名的 R 文件 假设您有以下名为 test Rmd 的 Rmd 文档 This is a test r chunk1 1 4
  • 从 Lua 调用活动程序中的 C++ 函数

    我不确定我的问题是否有意义 但我当然知道从谷歌获得结果几乎是不可能的 首先 我做什么not想 我不想调用一些打印 hello world 或将两个数字相加的函数 我想从 C 程序加载 Lua 脚本 但允许脚本使用函数修改 C 程序的变量 例