如何将 C++ unions 暴露给 Lua

为了一个我正在开发的项目,我需要将另一个库中的一些C++类暴露给Lua。不幸的是,这个库中最重要的类之一有很多联合和枚举 (来自 SFML 的 sf::Event类),并且从一个快速的谷歌搜索中我发现没有关于将C++联合暴露给Lua的内容。我不介意用Lua/C API、库或绑定生成器来进行暴露,只要它起作用即可。但是,我更喜欢不使用绑定生成器,因为我想能够在C++中创建一个对象,然后将该对象实例暴露给Lua (除非使用绑定生成器能够实现这一点)。

点赞
用户3137484
用户3137484

如果您愿意使用boost::variant而不是union,您可以尝试使用我的LuaCast库。

我也会尝试将union作为基本类型添加。

2015-08-09 07:23:40
用户5079510
用户5079510

为了注册 C/C++ 函数,您需要先让您的函数看起来像 Lua 提供的标准 C 函数模式:

extern "C" int MyFunc(lua_State* L)
{
    int a = lua_tointeger(L, 1); // 第一个参数
    int b = lua_tointeger(L, 2); // 第二个参数
    int result = a + b;

    lua_pushinteger(L, result);

    return 1; // 返回值数量
}

每个需要在 Lua 中注册的函数都应该遵循这个模式。返回类型为 int,单个参数为 lua_State* L,返回值的数量为 1。 然后,您需要将其注册到 Lua 的注册表中,这样您就可以将其公开到脚本的上下文中:

lua_register(L, "MyFunc", MyFunc);

要注册简单的变量,可以编写以下内容:

lua_pushinteger(L, 10);
lua_setglobal(L, "MyVar");

之后,您就可以从 Lua 脚本中调用该函数。请记住,在使用用于注册它们的特定 Lua 状态运行任何脚本之前,您应该注册所有对象。

在 Lua 中:

print(MyFunc(10, MyVar))

结果:

20

我想这可能会对您有所帮助!

2015-08-12 09:52:30