gpt4 book ai didi

c++ - 如何将 C++ 成员方法和成员变量与 Lua C API 绑定(bind)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:16 26 4
gpt4 key购买 nike

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

让我用最基本的方式描述一下:

  • 假设您有一个 C++ 类

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

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

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

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

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

  1. 在只调用一次的函数中,不管 A 的实例数:
    • 创建新元表(MT)
    • pushvalue( -1 ) (我不太明白)
    • setfield(-2, "__index")
    • 使用从 checkudata 解压 A* 指针的静态版本的方法推送函数
    • setfield(-2, "方法")
  2. 在为每个实例调用的初始化函数中,例如富:
    • 用 newuserdata 创建一个指向 Foo 的指针
    • 设置元数据(MT)
    • setglobal with Foo 使名称对 lua 可用
  3. 在 main 的测试函数中:
    • pcall 一个测试函数,上面提到的 3 行 .lua,通过全局名称

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

到目前为止 :Method() 一切顺利。

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

这也很好用。

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

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

实际的代码片段比纯粹的理论废话更受欢迎。

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

最佳答案

the Method() call no longer calls the Method() static function, but goes into the __index function you bound instead.

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

关于c++ - 如何将 C++ 成员方法和成员变量与 Lua C API 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23805174/

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