C++和Lua:自动注册函数

当我在C#中使用Lua时,我会向我想要在Lua中注册的方法添加属性,类似于这样:

// place tile marker
[LuaExport("settilemarker")]
public void SetTileMarker(int x, int y)
{
    TileEditor.X = x;
    TileEditor.Y = y;
}

然后,在运行时我会使用反射来查找所有这些函数并自动地注册它们,使用一个不必为每个新函数更新的简短代码。 这也可以用于自动构建所有已注册命令的列表等。

我的问题是,有没有办法在C++中使用Lua做到这一点?像某种宏之类的东西。 这些信息在运行时不必可用,我只是想方便地标记每个函数的定义,并使它们自动注册,而不是有一个长的lua_register(..) somewhere的区域。

顺便说一下,我已经找到了一些工具,似乎能够生成这个功能所需的代码,但我希望有一种不需要除了点击Build之外的其他手动工作的方法。 如果没有,我将不得不仔细研究这些工具。

顺便说一下,使用Visual Studio 2010。

点赞
用户151501
用户151501

你是否了解 SWIG 这个工具。我曾经使用过它,虽然它有点复杂,但它确实可以自动化许多事情。

2011-08-22 02:13:51
用户734069
用户734069

C 和 C++ 没有反射机制。因此,你使用的任何工具都需要至少一些手动工作。你需要为每个想要导出的函数输入内容,或者将原型放入特定的位置等。

有一份 Lua 绑定工具列表可供选择。其中一些工具是半自动化的,包括可以读取 C++ 的一些子集并半自动地生成绑定代码的解析器。其中包括 SWIG、toLua 和 toLua++。其他工具需要更多的工作,但使得明确声明行为(如拥有权等)更容易。

2011-08-22 04:18:50
用户385892
用户385892

你想要编写的语法类似于使用Luabind将你的C++函数导出到Lua时要编写的语法。

我曾经直接使用Lua C API将Lua与C++集成,但自从我发现了Luabind以后,我再也不这么做了。

在程序初始化中,你可能会有这样的代码。

#include <lua.hpp>
#include <luabind/luabind.hpp>

lua_State * L = luaL_newstate();
luaL_openlibs(L);
luabind::open(L);
luabind::module(L) [
    luabind::def("settilemarker", &SetTileMarker)
];

如果SetTileMarker不是一个自由函数而是类Foo的一个方法,则需要像这样做。

luabind::module(L) [
    luabind::class_<Foo>("foo")
        .def("settilemarker", &Foo::SetTileMarker)
];

这虽然不能像在代码各处分布注册一样聪明,但我发现它比直接使用Lua C API更容易理解和编写语法。

2011-08-22 19:50:09