如何将C ++联合公开给Lua

时间:2015-08-03 20:57:12

标签: c++ lua unions

对于我正在进行的项目,我需要将另一个库中的一些C ++类暴露给Lua。不幸的是,这个库中最重要的一个类有很多Unions和Enums(the sf::Event class from SFML),而且从quick Google search我发现没有任何关于将C ++ Unions暴露给Lua的内容。我不介意用Lua / C API,库或绑定生成器公开它,只要它有效。但是,我不想使用绑定生成器,因为我希望能够在C ++中创建一个对象,然后将该对象的实例暴露给Lua(除非可以使用绑定生成器)

2 个答案:

答案 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库。

我也会尝试将联盟添加为基类型。