对于我正在进行的项目,我需要将另一个库中的一些C ++类暴露给Lua。不幸的是,这个库中最重要的一个类有很多Unions和Enums(the sf::Event class from SFML),而且从quick Google search我发现没有任何关于将C ++ Unions暴露给Lua的内容。我不介意用Lua / C API,库或绑定生成器公开它,只要它有效。但是,我不想使用绑定生成器,因为我希望能够在C ++中创建一个对象,然后将该对象的实例暴露给Lua(除非可以使用绑定生成器)
答案 0 :(得分:1)
要注册C / C ++函数,首先需要让函数看起来像Lua提供的标准C函数模式:
extern "C" int MyFunc(lua_State* L)
{
int a = lua_tointeger(L, 1); // First argument
int b = lua_tointeger(L, 2); // Second argument
int result = a + b;
lua_pushinteger(L, result);
return 1; // Count of returned values
}
需要在Lua中注册的每个函数都应遵循此模式。返回int
类型,lua_State* L
的单个参数。并返回值的计数。
然后,您需要在Lua的寄存器表中注册它,以便将它暴露给脚本的上下文:
lua_register(L, "MyFunc", MyFunc);
对于注册简单变量,您可以这样写:
lua_pushinteger(L, 10);
lua_setglobal(L, "MyVar");
之后,您可以从Lua脚本调用您的函数。请记住,在运行具有您用于注册它们的特定Lua状态的任何脚本之前,您应该注册所有对象。
在Lua:
print(MyFunc(10, MyVar))
结果:
20
我想这可以帮到你!
答案 1 :(得分:0)
如果您愿意使用boost :: variant而不是union,那么您可以尝试使用我的LuaCast库。
我也会尝试将联盟添加为基类型。