在不知道userdata实现的情况下,我可以在C ++中使用它的字段吗?

时间:2017-04-29 10:16:09

标签: lua lua-api

我可以从我的C ++代码中获取用户数据。我想知道我是否可以将它转换为某种东西,这样我就可以取消引用它的字段并调用它的方法而不需要通过Lua。

换句话说:

一旦我获得了一个userdata并将其放入Lua堆栈中,我怎样才能将其作为特定类的对象使用?我知道我感兴趣的所有字段和方法(他们的Lua名称),但不一定是用户数据底层实现提供的所有字段和方法。

有没有办法以某种方式创建一个可以知道每个成员的偏移量的界面?

我相信问题是,如何知道userdata的Lua视图中每个成员的偏移量,所以我可以创建一个结构来将reg excess_returns excess_market 返回void *转换为?< / p>

1 个答案:

答案 0 :(得分:1)

Userdata只是一个二进制blob。字节数组。这些字节将如何被解释 - 完全取决于该userdata提供的接口,可以与方法或其他协议一起使用。

如果您的代码创建了该userdata,那么您要么知道那里有什么类型的本机对象(知道某些func只生成或接受特定类型),或者您可以将类型标识符作为userdata blob的第一个字节放置,所以你可以检查该id并将userdata指针切换/转换为特定的类。

如果该用户数据由某人的代码创建 - 您只能依赖其metatable中提供的方法(您可以从本机代码访问它),或者只是将其视为字节数组,而不必知道存储在那里的实际数据类型。或者做一些hackish猜测,让它在某些情况下工作,如果你的猜测不正确就会严重崩溃。