【问题标题】:Without knowing the userdata implementation, can I use its fields from inside C++?在不知道 userdata 实现的情况下,我可以在 C++ 中使用它的字段吗?
【发布时间】:2017-09-27 09:49:26
【问题描述】:

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

换句话说:

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

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

我相信问题是,我如何知道用户数据的 Lua 视图中每个成员的偏移量,所以我可以创建一个结构来将 lua_touserdata 返回的 void * 转换为?

【问题讨论】:

    标签: lua lua-api


    【解决方案1】:

    Userdata 只是一个二进制 blob。字节数组。这些字节将如何被解释 - 完全取决于该用户数据提供的接口,是否可以通过方法或其他协议进行元转换。

    如果该用户数据是由您的代码创建的,那么您要么知道存在什么类型的本机对象(知道某些 func 仅生成或接受特定类型),要么您可以将类型标识符作为用户数据 blob 的第一个字节,这样您可以检查该 id 并将 userdata 指针切换/转换为特定类。

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

    【讨论】:

    • 没有办法“询问 Lua”给定成员的偏移量吗?
    • @FinnTheHuman:用户数据的成员不一定对应于任何“真正的”C(子)对象;它们只是调用__index__newindex 元方法的语法糖。由于这些元方法可以做任何事情,并且不仅限于返回对 blob 一部分的固定引用,因此 Lua 不可能为给定成员提供偏移量。如果你只是想做相当于调用这些元方法,但从 C 而不是从 Lua,只需使用 lua_getfieldlua_setfield(如果它们存在,它们将触发任何元方法)。
    • @Mankarse 谢谢。所以跳过 Lua 的唯一方法是让类型作者为它创建一个实际的接口?
    • @FinnTheHuman:是的。您需要让作者提供一个对指向用户数据类型的不透明指针进行操作的函数,或者您需要作者提供提供保证接口的结构声明;您可以将用户数据投射到其中。
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2013-05-26
    • 2017-12-23
    • 2021-01-15
    • 2010-11-05
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多