通过Swig在C++和Lua之间传递变量

3
我正在一个C++项目中工作,其中有大量的类(150+),每个类都有10到300个字段。我希望能够提供一个脚本界面,以便进行测试,这样我就可以编写不需要重新编译的回调函数。由于我比较熟悉Lua的C API,因此我希望使用Lua来实现这一点,但如果使用Python会更方便,我也很愿意尝试。
我已经了解了如何从我的C++代码中调用Lua函数,以及如何在Lua和C++之间传递基本数据类型。我想知道的问题是如何使用SWIG在两者之间共享用户指定的数据类型。
例如,在我的C++代码中的某些时候,我可能想要评估一个具有250个字段的对象中的几个成员数据。我希望能够将该对象交给Lua,然后(希望)使用生成的SWIG包装器来操作该对象,显示特定字段,然后将(可能已更改的)对象传递回C++以继续使用。
我还希望能够在Lua中使用SWIG包装器实例化一个对象的实例,并将其传递给C++,以便像普通的C++版本一样使用该对象。
这是可能的吗?有人能向我指出教程或明确的示例吗?
感谢您能提供的任何帮助!
3个回答

1
只要使用Swig接口(有关Swig-Lua API的文档请参见此处),将用户定义类型进行包装,交互就应该是无缝的。提供的Swig包装器将允许您实例化新对象,将它们传递给C++,反之亦然。
我不认为Swig-Lua包装支持导演类,这意味着扩展现有类、实例化它们并将它们传回C++是不可能的。但是,对于Python、Java、C#等语言,支持导演类。

太好了,感谢提供链接!即使只是单向的也是很大的帮助。即使我不能在Lua中创建一个全新的对象并将其传回C++,您是否知道我是否可以修改传递给Lua的现有C++对象?也就是说,我能否创建一个C++对象,将其传递给Lua,在Lua中更改一些字段,然后使用更新后的字段在C++中继续使用它? - zslayton
当然可以。通过SWIG提供的接口修改LUA中的对象实际上会修改底层的C++对象。这一切都非常无缝。SWIG还可以很好地处理诸如数组、STL、指针、工厂类型函数和基于运算符的类接口(包括智能指针)等语言特性。 - ASk

1
如果使用swig出现问题,我建议尝试最新版本的tolua++,它专门用于将C++和Lua绑定。需要一个修改过的.h文件作为输入,这可能有点繁琐,但不比Swig的模块更麻烦。我没有理由偏好其中任何一个,但了解两者都是很好的。

0
你还应该看看 Luabind。它实现了 Lua 的面向对象编程,并且可以将 Lua 中的类和数据类型映射回 C++。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接