【问题标题】:How do you bind C++ member methods and member variables with the Lua C API?如何将 C++ 成员方法和成员变量与 Lua C API 绑定?
【发布时间】:2014-07-11 09:26:35
【问题描述】:

到目前为止,我所做的所有谷歌搜索都发现了一些非常接近但并没有完全符合我想要做的事情。

让我以最基本的方式描述这一点:

  • 假设你有一个 C++ 类

    class A
    {
    public:
        int Method();
        int Variable;
    };
    
  • 现在假设您实例化了 A* Foo;

  • 现在假设您有一个 .lua 文件,其中包含以下 3 行函数:

    function Test()
        local n = Foo:Method();
        Foo.Variable = 0;
        local m = Foo.Variable;
    end
    

如何将对象 A* 绑定到 lua 以使所有这些事情都可行?

在伪代码方面,我的第一次尝试是这样的,部分来自复制粘贴示例:

  1. 在只调用一次的函数中,与 A 的实例数无关:
    • 创建新的元表(MT)
    • pushvalue(-1)(我不太明白)
    • setfield(-2, "__index" )
    • pushcfunction 带有一个静态版本的 Method,它从 checkudata 中解压 A* 指针
    • setfield(-2, "方法")
  2. 在为每个实例调用的 init 函数中,例如福:
    • 使用 newuserdata 创建指向 Foo 的指针
    • setmetatable(MT)
    • setglobal 和 Foo 使名称对 lua 可用
  3. 在 main 的测试函数中:
    • 使用上面提到的 .lua 的 3 行,按全局名称调用一个测试函数

执行此操作时, Foo:Hide();成功调用了我的静态函数,它成功解压了指针并调用了它的成员 Hide()。

到目前为止,对于 :Method() 来说还不错。

然后我尝试支持 .Variable 访问。似乎每个人都在说这次要再次使用元表来覆盖 __index 和 __newindex 并使它们成为一种通用的 Get/Set,您可以在其中支持某些键作为有效的变量链接,例如if( key == "变量" ) 变量 = val;

这也很好用。

问题在于试图将这两件事放在一起。只要您使用适用于变量的 getter/setter 覆盖 __index/__newindex,Method() 调用就不再调用 Method() 静态函数,而是进入您绑定的 __index 函数。

综上所述,如何支持这种看似基本的用例组合?

实际的代码 sn-ps 将比纯粹的理论喋喋不休更受欢迎。

提醒:请仅使用基本的 C API 进行响应,而不是第三方的东西。

【问题讨论】:

  • Lua 没有 C++ API,你必须使用 C++ 中的 C API
  • 请仅使用基本的 C API 进行响应,而不是第三方的东西。 - 那你就完蛋了。从字面上和完全。向 Lua 公开 C++ 对象极其复杂,如果您不想使用外部库,则注定要重新实现它们。
  • OP 拒绝使用所有这些。
  • @Lightness:不。他显然是在用 C++ 编写代码。
  • 那我就简单说一下:他应该使用C++包装器。

标签: c++ lua


【解决方案1】:

Method() 调用不再调用 Method() 静态函数,而是 改为进入您绑定的 __index 函数。

因此对其进行编程,如果键存在于表中,则首先返回该键,否则使用 getter/setter。

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多