我想传递给一个函数,该函数期望纯虚拟类的C ++对象是从纯虚拟C ++类派生的类的Lua对象。我怎么能这样做?
我是lua和luabind的新手,所以请耐心等待。
在C ++中:
struct A {
virtual void foo() = 0;
};
void do_something(A* a) {
a->foo();
}
在Lua:
class 'MyA' (A)
....
function MyA:foo()
print('hi')
end
再次使用C ++:
... // somehow create an instance of MyA class and named myA
// How?
// Maybe the result of a call to "MyA()"?
do_something(myA);
答案 0 :(得分:2)
您必须创建一个实现纯虚函数的C ++类,然后调用Lua代码。实施太复杂了,不能在这里投入。
基本伪代码:
// C++
struct LuaA : public A
{
LuaA(const std::string &luacode)
: myLuaHandler(luacode)
{
}
virtual void foo()
{
myLuaHandler.call("MyA:foo()");
}
}
这个例子是非常高的水平,但它意味着要表明你想要做的事情是非平凡的。这是你希望实际暴露给你的Lua代码的新“LuaA”。
一般情况下,我喜欢在包装C ++以使用Lua和其他脚本语言时使用SWIG。 SWIG确实支持您感兴趣的虚拟方法的重载(在SWIG用语中称为“控制器”),但是,应该注意Lua / SWIG不支持控制器。 Java,C#,Ruby,Perl和Python都在SWIG中拥有导演支持。我不确定为什么Lua不支持它。
由于Lua不支持继承,因此您想要完成的内容的确切语义是不可能的。
也许其他人对Lua方面有更好的答案?
答案 1 :(得分:2)
请参阅LuaBind文档中的10.1部分。您基本上为LuaBind类提供了一个简单的C ++包装器,它充当底层Lua实现的传递。请注意以下文档中的以下内容:
virtual void f(int a)
{
call<void>("f", a);
}
call(“f”,a)将调用Lua'f'函数,传入参数a。
答案 2 :(得分:2)
对不起,我不会直接回答您提出的问题,但会从个人经验中提出一些建议:
如果你是 new 到Lua,你应该认真考虑在原始Lua API 中编写你的第一个绑定,而不使用这种面向对象的布局。至少你会理解真正正在进行什么。
Lua API单独使用非常舒适。它不会产生任何额外的开销,您可以完全控制正在发生的事情。 Luabind图书馆的开发目前有点陈旧(但它看起来虽然恢复了生机)。
你应该考虑你是否 需要模仿Lua-side,特别是C ++方面的C ++类派生。对于Lua来说这样的事情并不那么自然,需要明显的开销才能实现。此外,在C ++中,您隐藏的事实是您正在对另一种语言进行非本地调用。除非有详细记录,否则这是性能问题的潜在来源。
几年前,当我开始使用Lua时,我习惯用和Luabind一样的方式编写绑定,并模仿从C ++对象派生。现在我使用的是纯Lua API和简单的过程(而不是面向对象的)跨语言接口。我对结果感到非常满意。
答案 3 :(得分:1)
我将在C ++中继承纯虚拟类,然后可能从luabind开始(根据Aaron和lefticus的解决方案)。如果这个开销太大,我将只使用直接的Lua C堆栈 - twiddling API(按照亚历山大)。
因此,这里没有人回答。我稍后会发表评论结果。
谢谢大家!