C++ Lua/SWIG从Lua中包装用户数据

C++ Lua/SWIG从Lua中包装用户数据,c++,lua,swig,C++,Lua,Swig,我正在使用swiglua。我在Lua中调用了一个函数,它返回一个指针(userdata)。现在我知道这个指针是什么,但是我如何才能从Lua内部区分Lua呢?从: 可设置元表(表,元表) 设置给定对象的元表 桌子(您不能更改 Lua中其他类型的元表, 只有来自C。) 您不能“告诉Lua”Lua中的userdata是什么。它必须通过使用C API的绑定函数调用来指定或操作。有关更多信息,请参阅。用户数据的定义就是Lua不知道、不能知道、也不想知道它是什么。这是你的数据,这是你的问题。如果要操作它,则

我正在使用swiglua。我在Lua中调用了一个函数,它返回一个指针(userdata)。现在我知道这个指针是什么,但是我如何才能从Lua内部区分Lua呢?

从:

可设置元表(表,元表)

设置给定对象的元表 桌子(您不能更改 Lua中其他类型的元表, 只有来自C。)


您不能“告诉Lua”Lua中的
userdata
是什么。它必须通过使用C API的绑定函数调用来指定或操作。有关更多信息,请参阅。

用户数据的定义就是Lua不知道、不能知道、也不想知道它是什么。这是你的数据,这是你的问题。如果要操作它,则必须使用它调用C函数(通过metatable设置可以使用运算符重载)。

告诉SWIG该指针指向的数据类型。如果SWIG知道该类型,那么它将把它作为
userdata
传递给Lua,并附加一个合适的元表,允许Lua端访问和修改各个数据字段(如果它是一个类,则调用它的方法)

这可能意味着告诉SWIG一些库不需要的数据类型,但从长远来看可能是值得的


Lua所知道的关于userdata类型的所有信息都包含在其元表中。如果两个
userdata
值具有相同的元表,则它们的类型相同。该元表负责调解从Lua端对its内容的所有访问,并且通常由用C实现的方法组成,这样做是可能的。如果没有这样的元表,那么Lua端只能将
userdata
视为不透明的blob。

我不是说Lua应该知道。我知道它不能,但是SWIG不能说点什么吗?SWIG只能执行默认API中可用的操作,它不能重写源代码或语言。当lua_TuserData返回void*时,除非SWIG使用内部独立系统自动处理此结果并将正确类型传递给您,否则您只能得到void*。