到目前为止我所做的所有谷歌搜索都发现了非常接近的事情,但并不是因为我试图做的事情而完全削减它。
让我以最基本的方式对此进行描述:
想象一下你有一个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 *绑定到lua,以便所有这些都可行?
伪代码,我的第一次尝试是这样的,部分来自复制粘贴的例子:
这样做时,Foo:Hide();成功调用了我的静态函数,该函数成功解压缩指针并调用其成员Hide()。
到目前为止很好:方法()。
然后我尝试支持.Variable访问。每个人似乎都说要再次使用metatables来覆盖__index和__newindex,并使它们成为一种通用的Get / Set,在这里你可以将某些键支持为有效的变量链接,例如: if(key ==" Variable")Variable = val;
这也很好。
问题是试图把这两件事放在一起。只要使用适用于Variable的getter / setter覆盖__index / __ newindex,Method()调用就不再调用Method()静态函数,而是进入你绑定的__index函数。
所有这些都说,如何支持这种看似基本的用例组合?
实际的代码片段比纯粹的理论喋喋不休更受欢迎。
提醒:请仅使用基本的C API进行回复,而不是第三方的回复。
答案 0 :(得分:0)
Method()调用不再调用Method()静态函数,但是 进入你绑定的__index函数。
所以对它进行编程,以便如果表中存在键,则首先返回,否则请使用getter / setter。
答案 1 :(得分:-2)
如果您手动执行此操作,最终会编写错误的副本。请提供不使用现成绑定库的正当理由?你在C ++代码中使用STL吗?
您可能还想阅读lua-users:Binding Code to Lua
使用LuaBridge:
#include <LuaBridge.h>
#include <RefCountedPtr.h>
...
struct A
{
int Method() { return 1; }
int Variable;
};
...
void register_my_stuff(lua_State *L) {
luabridge::getGlobalNamespace(L)
.beginClass<A>("A")
.addConstructor<void (*)(), RefCountedPtr<A> >()
.addFunction("Method", &A::Method)
.addData("Variable", &A::Variable)
.endClass()
;
}
的Lua:
function Test()
local Foo = Core.A()
local n = Foo:Method()
assert ( n == 1 )
Foo.Variable = 42;
local m = Foo.Variable;
assert( m == 42 )
end
Test()
无需编写自己的错误样板