2012-02-26 163 views
2

我正在用SWIG将一些C++类导出到Lua。我宣布在这样的SWIG接口文件boost ::文件系统::路径:SWIG:Lua - 将C++实例作为lua函数参数传递

namespace boost 
{ 
    namespace filesystem 
    { 
     class path {}; 
    } 
} 

现在我想打电话给在Lua中声明的函数,它应该采取一个boost ::文件系统::路径&为参数将其传递给另一个对象。我只需要能够将路径传递给对象。我不需要使用路径对象的任何功能。

function on_path_selected(the_path) 
    another_object:set_path(the_path) 
end 

我打算从C++中使用它的索引来调用Lua函数。

lua_rawgeti(L, LUA_REGISTRYINDEX, m_function_index); 
lua_push[SOMETHING](L, path_object); // <-- HOW TO ? 
lua_pcall(L,1,0,0) 

问题:如何将boost :: filesystem :: path作为参数推送到Lua函数中?

回答

5

这实际上相当复杂。 SWIG的预期用途是为Lua创建模块。 Lua脚本应该是决定被调用的和不调用的。它并不是真正意义上的嵌入式应用,您可以使用SWIG来公开一些C++对象,然后直接从您的应用程序调用Lua代码。

这并不是说这是不可能的,只是很复杂。

所有基于SWIG的C++对象都通过Lua作为指针传递。因此,所有权是一个问题;你不能只是将一个指向堆栈对象的指针移入Lua。

最安全的方法是将对象的新副本传递给Lua。那样,Lua拥有了这个指针。 SWIG会知道Lua拥有这个指针,并且会附加一个适当的垃圾收集机制来清理它。所以一切都应该是美好的,记忆明智的。

但是这样做需要适当的“拳击”(因为想要一个更好的术语)反对SWIG希望完成的方式。这需要使用某些SWIG宏。

鉴于你是如何绑定的path类型痛饮,你会做这样的事情坚持下去到一个Lua栈:

swig_type_info *pathType = SWIG_TypeQuery("boost::filesystem::path *"); 
boost::filesystem::path *pArg = new boost::filesystem::path(the_path); 
SWIG_NewPointerObj(L, pArg, outputType, 1); 

SWIG_TypeQuery取指已绑定的痛饮到任何对象的类型Lua中。 SWIG_NewPointerObj需要此类型的信息对象,该对象需要一个指向该类型的指针。这两个都是宏。 SWIG_NewPointerObj给予指针的Lua所有权;感谢SWIG的metatables,Lua的垃圾收集器将删除它。另外SWIG_NewPointerObj将物体推到lua_State堆栈上。

一旦它在堆栈上,你可以做任何你想做的事情。将它从函数返回给Lua,将其作为参数传递给Lua函数,将其粘贴到全局变量中等。这是一个Lua值。

现在,如果你在你的项目中输入这段代码,那么当编译器看到swig_type_info时,你会得到一个编译错误。在SWIG的命令行生成的源文件中,此类型在内部定义为

你有两个选择:

  1. 将这个源代码到.swig文件本身。对真的。您可以在verbatum部分(%{%}分隔的块)内定义常规C++函数。这些功能将直接复制到SWIG生成的代码中。您可以通过将标题放入标题来访问它们。这是最简单和最简单的工作方式。这通常用于创建特殊接口,其中一个预先存在的C++函数不适用于Lua API(或者根本不存在)。

  2. 您可以使用-external-runtime参数生成包含这些定义的适当头。这必须是与生成.cpp文件的步骤不同的SWIG执行步骤。看,它实际上并没有处理SWIG文件或任何东西。所有它需要的是目标语言(-lua)以及您是否使用C++(-c++)。因此只需要一个命令swig -c++ -lua -external-runtime someheader.h,这就是获取类型和宏所需的全部内容。

    包括在你想痛饮绑定对象连接到Lua中的任何来源,标头。

+0

谢谢你为这个伟大的答案。我目前正在挖掘生成的SWIG cpp源文件,我可以完全理解你所描述的正确性水平。是的,看起来要找到一种优雅的方式来实现这一目标将是一个很长的路要走。 非常感谢! 编辑:只要我看到按钮,就会将其标记为答案。 – damian 2012-02-26 19:57:58

相关问题