如何在C++和Lua之间共享数据?

3
我一直在寻找有关如何使用API在Lua中共享C++对象的教程。大多数教程只显示如何导出类。
我想从非常简单的开始,以这样的方式公开一个变量(例如int myVar = 5),以便在Lua中进行更改会反映在C++应用程序中。
有人知道任何好的教程可以向我展示如何做到这一点吗?
3个回答

5
使用Lua API直接修改变量并不简单。您需要创建一个Lua表或userdata(分别使用lua_newtablelua_newuserdata),然后创建一个元表 - 在您的情况下,它应该具有用于读取和写入访问的__index__newindex事件,并在这些函数中通过名称匹配您的变量。手动编写此内容并不容易。
也就是说,很明显您不能将变量暴露在全局Lua级别 - 您应该将其作为表/ userdata的成员。这看起来非常像Lua中的类/对象,因此仅公开单个变量并不比公开类更简单。更重要的是,公开函数/方法要简单得多。因此,阅读关于公开类的教程肯定会有所帮助。
但仅使用Lua API仍然不好玩。不要误解我,Lua API很棒,但如果您需要公开很多内容,那么它会变得非常乏味,您最终要么编写很多枯燥重复的代码以绑定您的类,要么编写某种工具来自动化此任务(使用大量宏可能是您的第一个想法,我已经做过了 ;))。这样的工具已经存在,例如tolua++luabind等。

这看起来就是我在找的。我能否使用类似的方法进一步扩展,以访问像scene.objects [5] .material.diffuseColor.red这样的数据? - Tom Savage

4
正如sbk所提到的,您可以将变量作为userdata的成员进行访问:
print(cside.myVar) -- 5

以下是使用Lua API实现此操作的示例代码。虽然有些单调乏味,但很简单。您可以编写自己的代码生成器或使用类似于swig或tolua ++的工具。

/* gcc -o simple simple.c -llua -lm -ldl */
#include <stdio.h>

#include "lua.h"
#include "lauxlib.h"

int myVar = 5;

int l_set( lua_State *L )
{
 const char *key = luaL_checkstring(L, 2);
 int val = luaL_checkint(L, 3);

 if (strcmp(key, "myVar") == 0)
  myVar = val;
}

int l_get( lua_State *L )
{
 const char *key = luaL_checkstring(L, 2);

 if (strcmp(key, "myVar") == 0)
 {
  lua_pushinteger(L, myVar);
  return 1;
 }
}

int main(int argc, char *argv[])
{
 const struct luaL_Reg somemt[] =
 {
  { "__index", l_get   },
  { "__newindex", l_set   },
  { NULL, NULL }
 };

 lua_State *L = luaL_newstate();
 luaL_openlibs( L );

 lua_newuserdata(L, sizeof(void *));

 luaL_newmetatable(L, "somemt");
 luaL_register( L, NULL, somemt );
 lua_setmetatable(L, -2);

 lua_setglobal(L, "cside");

 luaL_dostring(L, "print('from Lua:', cside.myVar)");
 luaL_dostring(L, "cside.myVar = 200");

 printf( "from C: myVar = %d\n", myVar );
}

2

听起来你想看一下tolua++


我真的很想使用Lua的API来完成它,而不是使用库,但我会看一下的。 - Tom Savage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接