在不知道 userdata 实现的情况下,我可以从 C++ 内部使用它的字段吗?
Without knowing the userdata implementation, can I use its fields from inside C++?
我可以从我的 C++ 代码中获取用户数据。我想知道我是否可以将它转换为某些东西,这样我就可以取消引用它的字段并调用它的方法而无需通过 Lua.
换句话说:
获取到一个userdata,放到Lua栈中,如何取出来作为某个class的对象?我知道我感兴趣的所有字段和方法(它们的 Lua 名称),但不一定知道 userdata 底层实现提供的所有字段和方法。
有没有办法以某种方式创建一个可以知道每个成员的偏移量的接口?
我认为问题是,我如何知道用户数据的 Lua 视图中每个成员的偏移量,因此我可以创建一个结构来转换 [= 返回的 void *
11=]到?
Userdata 只是一个二进制 blob。字节数组。如何解释这些字节 - 完全取决于随该用户数据提供的接口,无论是方法元表,还是其他一些协议。
如果用户数据是由您的代码创建的,那么您要么知道那里有什么类型的本机对象(知道某些函数只生成或接受特定类型),要么您可以将类型标识符作为用户数据 blob 的第一个字节,所以你可以检查 id 和 switch/cast 用户数据指向特定 class.
的指针
如果用户数据是由某人的代码创建的 - 您只能依赖其元表中提供的方法(您可以从本机代码访问它),或者只是将其视为字节数组,而不知道存储的实际数据类型那里。或者做一些骇人听闻的猜测,让它在某些情况下工作,如果你的猜测不正确,就会严重崩溃。
我可以从我的 C++ 代码中获取用户数据。我想知道我是否可以将它转换为某些东西,这样我就可以取消引用它的字段并调用它的方法而无需通过 Lua.
换句话说:
获取到一个userdata,放到Lua栈中,如何取出来作为某个class的对象?我知道我感兴趣的所有字段和方法(它们的 Lua 名称),但不一定知道 userdata 底层实现提供的所有字段和方法。
有没有办法以某种方式创建一个可以知道每个成员的偏移量的接口?
我认为问题是,我如何知道用户数据的 Lua 视图中每个成员的偏移量,因此我可以创建一个结构来转换 [= 返回的 void *
11=]到?
Userdata 只是一个二进制 blob。字节数组。如何解释这些字节 - 完全取决于随该用户数据提供的接口,无论是方法元表,还是其他一些协议。
如果用户数据是由您的代码创建的,那么您要么知道那里有什么类型的本机对象(知道某些函数只生成或接受特定类型),要么您可以将类型标识符作为用户数据 blob 的第一个字节,所以你可以检查 id 和 switch/cast 用户数据指向特定 class.
的指针如果用户数据是由某人的代码创建的 - 您只能依赖其元表中提供的方法(您可以从本机代码访问它),或者只是将其视为字节数组,而不知道存储的实际数据类型那里。或者做一些骇人听闻的猜测,让它在某些情况下工作,如果你的猜测不正确,就会严重崩溃。