gpt4 book ai didi

c++ - 从 Lua 调用事件程序中的 C++ 函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:15 25 4
gpt4 key购买 nike

我不确定我的问题是否有任何意义,但我当然知道从 Google 获得结果几乎是不可能的。首先,是我想要的。我不想调用一些打印“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上when searching "Call C++ Function from Lua"假设没有程序,只有一个 .cpp/hpp 文件,其中包含您要调用的一些函数。

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

最佳答案

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

要推出自己的绑定(bind),您应该:

  1. 完全掌握 Lua 元表。
  2. 阅读 Programming in Lua C API 上的东西,特别是关于类的部分。或者,您可以阅读手册、阅读源代码(尤其是 API header )并进行一些谷歌搜索,但这本书可能会为您节省一些时间。

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

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

当用户运行 foo.setNumber 时,您的 C++ __index 元方法将使用用户数据和字符串“setNumber”调用。这取决于您返回什么,这决定了 foo.setNumber 在 Lua 脚本中的计算结果。您希望 foo.setNumber 评估为 lua_CFunction,它期望 Foo 用户数据作为其第一个参数,以便您的类方法可以惯用地调用来自 Lua(即 foo:setNumber(12),它是 foo.setNumber(foo, 12) 的语法糖)。

这是一个非常低级别的手动过程,一旦掌握了它,您最终将创建一个库/模板/宏来为您做样板。那时你可能想要评估无数C++ binding libraries存在。然而,多亏了 Law of Leaky Abstractions最好先学会手动执行此操作。

关于c++ - 从 Lua 调用事件程序中的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31484773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com