c++和Lua:自动注册函数
C++ and Lua: automatically register functions
当我在c#中使用Lua时,我会为我想在Lua中注册的方法添加属性,就像这样:
// place tile marker
[LuaExport("settilemarker")]
public void SetTileMarker(int x, int y)
{
TileEditor.X = x;
TileEditor.Y = y;
}
然后,我会在运行时使用反射来查找所有这些函数并自动注册它们,使用一小段不必为每个新函数更新的代码。这也可以用来自动建立一个列表的所有注册命令很容易等。
我的问题是,有什么办法做到这一点与Lua在c++ ?比如某种宏之类的。这些信息不一定要在运行时可用,我只是想方便地在每个函数定义的地方标记它,并使它们都自动注册,而不是在lua_register(..)s的某个地方有一个长段。
我已经找到了一些工具,似乎能够生成代码,但我希望可能有一种方法,不需要任何额外的手工工作,除了点击构建。如果没有,我将不得不进一步研究这些工具。
顺便说一下,使用Visual Studio 2010。
C和c++没有反射。因此,您使用的任何工具都至少需要一些手工工作。对于每个想要导出的函数,你都必须键入,或者你必须将原型放到一个特殊的位置或其他地方。
有一个可用的Lua绑定实用程序列表。其中一些是半自动的,包括可以读取c++子集并半自动为其生成绑定代码的解析器。SWIG、toLua和toLua++就是其中之一。另一些则需要更多的工作,但使显式声明行为(如所有权等)变得更容易一些。
您想要编写的语法与使用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更容易和更符合语法。
您看过SWIG吗?我用过它,虽然有点复杂,但它确实为您自动化了许多事情。
- 构造函数的链接时间自动注册
- 如何将不同的成员函数指针分配给注册类的不同实例?
- 即使在已注册的 C 函数中,lua_sethook也会触发吗?
- 如何最大限度地减少使用标量 SIMD 内部函数的 SIMD 注册表的双重负载开销
- 当调用了一个用atexit()注册的函数时
- Openssl 线程安全回调函数注册,包括直接调用和间接调用
- 具有 VS2012 NativeDEStepOver 注册表项,该注册表项阻止单步执行特定函数的格式更改
- 为什么这行不通?第二个函数无法注册?
- 覆盖OnFileOpen和OnFileSave函数-注册表未更新
- 注册用于提升io_service的每个对象的回调函数是什么?
- 如何使用 atexit() 注册一个非 void 函数
- 注册一个C++类,以便函数稍后可以循环访问所有已注册的类
- Cython:在DLL中注册用于回调的Python函数
- 如何将类构造函数注册C++ Lua 用户数据并默认使用它
- 如何从无法注册到函数向导的 xll 加载项调用函数
- 为什么 COM 类需要构造函数?如何在不注册的情况下使用 COM 类
- 在 LuaBridge 中注册一个类的函数,然后通过 lua 脚本调用它?
- 在Lua中注册c++函数
- 如何处理这种情况(需要用变量参数注册函数)
- c++和Lua:自动注册函数