一个函数期望一个抽象类型 A 的 C++ 对象。我如何传递一个 A 的子类的 Lua 对象给它?
我想向一个接收纯虚类的 C++ 对象的函数传递一个 Lua 对象,该 Lua 对象派生自纯虚 C++ 类。我该如何做到这一点?
由于我是新手,对 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++ 中:
... // 使用某种方式创建一个 MyA 类的实例并命名为 myA
    // 如何?
    // 也许是调用 "MyA()" 的结果?
do_something(myA);
请参阅 LuaBind 文档中的 10.1 章节。你需要提供一个简单的 C++ 包装器来调用 LuaBind 类,这个包装器作为底层 Lua 实现的通道。请注意以下示例:
virtual void f(int a)
{
    call<void>("f", a);
}
调用 call("f", a) 将会调用 Lua 中的 f 函数,并将参数 a 传递给它。
对不起,我不会直接回答你的问题,但是会从个人经验中提供一些建议:
如果你是_Lua_新手,应该认真考虑使用原始Lua API编写你的第一个绑定,而不是使用面向对象的布局。至少你会明白发生了什么。
Lua API本身非常舒适。它不会创建任何额外开销,你完全可以控制什么正在发生。目前Luabind库的开发有点停滞(但它似乎又活跃起来了)。
你应该考虑是否_真的_需要在Lua端模仿从C++类派生的对象,尤其是在C++端。这种事对Lua来说并不是很自然,需要实现明显的开销。此外,在C++中,你隐藏了事实,即你正在对另一种语言进行非本地调用。除非有充分的文档,否则这可能是性能问题的潜在来源。
当几年前我开始使用Lua时,我也像你一样使用Luabind编写绑定,并模仿从C++对象派生。现在我使用纯Lua API和简单的过程式跨语言接口(与面向对象相对)。我对结果非常满意。
我将在 C++ 中创建纯虚拟类的子类,然后可能会开始使用 luabind(根据 Aaron 和 lefticus 的解决方案)。如果这太过耗费时间,我将只使用直接的Lua C堆栈操作API(根据Alexander的建议)。
因此,这里没有一个正确答案。我会稍后发布带有结果的评论。
谢谢大家!
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
 - 如何在roblox studio中1:1导入真实世界的地形?
 - 求解,lua_resume的第二次调用继续执行协程问题。
 - 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
 - SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
 - Lua实现网站后台开发
 - LUA错误显式返回,社区常见的规约是怎么样的
 - lua5.3下载库失败
 - 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
 - lua lanes多线程使用
 - 一个kv数据库
 - openresty 有没有比较轻量的 docker 镜像
 - 想问一下,有大佬用过luacurl吗
 - 在Lua执行过程中使用Load函数出现问题
 - 为什么 neovim 里没有显示一些特殊字符?
 - Lua比较两个表的值(不考虑键的顺序)
 - 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
 - 如何在 Visual Studio 2022 中运行 Lua 代码?
 - addEventListener 返回 nil Lua
 - Lua中获取用户配置主目录的跨平台方法
 
你需要创建一个 C++ 类,实现你的纯虚函数,然后调用 Lua 代码。实现代码比较复杂,难以在此处一一列举。
基本的伪代码如下:
// C++ struct LuaA : public A { LuaA(const std::string &luacode) : myLuaHandler(luacode) { } virtual void foo() { myLuaHandler.call("MyA:foo()"); } }该示例非常高级,但旨在展示您想要做的非常复杂。新的 "LuaA" 才是您实际想要向 Lua 代码公开的。
一般情况下,我更喜欢使用 SWIG 将我的 C++ 包装为可供 Lua 和其他脚本语言使用。SWIG 支持您感兴趣的这种虚函数重载(在 SWIG 术语中称为 "directors"),但应注意的是,Lua/SWIG 不支持 directors。Java、C#、Ruby、Perl 和 Python 在 SWIG 中都支持 directors。我不确定为什么 Lua 不支持 directors。
可能是因为 Lua 不支持继承,在提出的方案中无法实现您想要完成的确切语义。
也许有其他人对 Lua 方面有更好的答案?