一个函数期望一个抽象类型 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);
原文链接 https://stackoverflow.com/questions/803748
请参阅 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的建议)。
因此,这里没有一个正确答案。我会稍后发布带有结果的评论。
谢谢大家!
- 如何在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中获取用户配置主目录的跨平台方法
- 如何编写 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 方面有更好的答案?