gpt4 book ai didi

c++ - luabind 如何隐式转换对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:14 24 4
gpt4 key购买 nike

我想问一个关于其中发生的特定事件的问题,而无需深入探讨我正在从事的大型 multimap 书馆项目的太多无关细节。我正在使用 Luabind 使我的 C++ 代码与我的 Lua 代码接口(interface),并且我有一个具有继承性的类结构,如下所示:

GuiWidget

GuiButton : GuiWidget

我已经通过 Luabind 向 Lua 注册了这两个类。然后我执行以下操作,其中 widget 是指向 GuiWidget 类实例的指针:

lua_newtable(luaState);
luabind::object(luaState, widget).push(luaState);
lua_setfield(luaState, 2, "widget");
lua_setglobal(luaState, "event");
//This line connects to some other code I wrote that just executes a file and handles errors.
luaMachine->doFile(widget->getUserString("eventMouseButtonClick"));
lua_pushnil(luaState);
lua_setglobal(luaState, "event");

现在,同样的代码片段可以处理从按钮到滚动条甚至整个窗口的任何内容。因此,稍后在 lua 代码中,当单击复选框按钮时,我调用了这行代码:

event.widget:setSelected(not event.widget:getSelected())

这行得通。即使通过的指针是一个 GuiWidget 指针,lua 代码以某种方式知道为这个特定实例使用 GuiButton 类独有的功能。它是如何做到的?它如何获取小部件指针并自动知道特定小部件是一个按钮?我不相信这是可能的,所以我花了一段时间才找到那个解决方案,但我想我会在黑暗中试一试,它以某种方式奏效了。

最佳答案

你已经问了很长时间了,但我可能对此有答案......

  1. luabind 为您在启动可执行文件时注册的每种类型生成内部唯一 ID(+ 包装器等...)
  2. LUA_REGISTRYINDEX 中有一个名为 __luabind_class_id_map 的全局“映射”,将 typeid 转换为之前分配的内部唯一 ID
  3. 当您返回指针 (GuiWidget) 时,luabind 通过取消引用它来询问返回指针的 typeid -> typeid(ptr)。这令人惊讶地返回了 GuiButton 的 type_info 而不是 GuiWidget(尽管 GuiWidget ptr = new GuiButton();)
  4. 然后 luabind 将 GuiButton 的 typeid 转换为内部 ID,并在另一个 LUA_REGISTRYINDEX 表 (__luabind_class_map) 中找到对应的 class_rep。 class_rep 包含对象应如何存储在 Lua 端以及与已注册的 C++ 类相关的其他信息。

使它起作用的最后一个有趣的信息是,Lua 端的所有指针都像这样存储:dynamic_cast(ptr) 稍后允许从它自动转换到其他使用先前方法验证的类和 class_rep 中的继承信息

这就是这种隐式转换在 luabind 库中的大致完成方式。

关于c++ - luabind 如何隐式转换对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27387657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com