如何将c++联合暴露给Lua

How to expose C++ unions to Lua

本文关键字:暴露 Lua c++      更新时间:2023-10-16

对于我正在进行的一个项目,我需要将另一个库中的一些c++类公开给Lua。不幸的是,这个库中最重要的类之一有许多union和enum (SFML中的sf::Event类),并且通过快速的Google搜索,我发现没有任何关于将c++ union暴露给Lua的内容。我不介意它是否与Lua/C API,库或绑定生成器一起公开,只要它能工作。但是,我不喜欢使用绑定生成器,因为我希望能够在c++中创建对象,然后将该对象的实例公开给Lua(除非使用绑定生成器可能)

对于注册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

我想这对你有帮助!

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

我将尝试添加联合作为基类型