luabind如何隐式转换对象?

我不想过多涉及我正在工作的大型多库项目的细节,我想问一个关于其中发生的特定事件的问题。我正在使用 Luabind 来使我的 C++ 代码与我 Lua 代码进行接口,并且我有一个类结构体,其中包含如下的继承关系:

GuiWidget

GuiButton : GuiWidget

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

lua_newtable(luaState);
luabind::object(luaState, widget).push(luaState);
lua_setfield(luaState, 2, "widget");
lua_setglobal(luaState, "event");
// 这一行连接到我编写的一些其他代码,它只是执行文件并处理错误。
luaMachine->doFile(widget->getUserString("eventMouseButtonClick"));
lua_pushnil(luaState);
lua_setglobal(luaState, "event");

现在,同一段代码片段可以处理从按钮到滚动条甚至整个窗口的所有内容。因此,稍后在 lua 代码中,当点击复选框按钮时,我调用以下代码:

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

这行代码有效。即使是推送过来的指针是一个 GuiWidget 指针,lua 代码也知道为这个特定的实例使用 GuiButton 类的独特功能。它是如何做到的呢?它如何获取部件指针并自动知道该部件是一个按钮?我不相信这是可能的,因此我花了一段时间才找到这个解决方案,但我想尝试一下,它奇异地起作用了。

点赞
用户3527645
用户3527645

这已经是很久以前您的提问,但是我可能有对此的答案...

  1. 当您启动可执行文件时(+封装等等...),luabind会为您注册的每个类型生成内部唯一ID。
  2. 在LUA_REGISTRYINDEX中有一个全局的“map”叫做 __luabind_class_id_map,将typeid转换为先前分配的内部唯一ID。
  3. 当您返回指针(GuiWidget)时,luabind通过对其进行解引用来请求返回指针的typeid ->typeid(ptr)。令人惊讶的是,这将返回GuiButton而不是GuiWidget的type_info(尽管GuiWidget ptr=new GuiButton();)
  4. 然后,luabind将GuiButton的typeid转换为内部ID,并在另一个LUA_REGISTRYINDEX表(__luabind_class_map)中找到该类的class_rep。class_rep保存了有关注册的C ++类的对象应该如何存储在Lua方面的其他信息。

使其工作的最后一个有趣信息是,在Lua一侧的所有指针都存储如下:dynamic_cast(ptr),这样稍后就可以将其自动强制转换为使用先前方法和class_rep中的继承信息验证的其他类

这大致是luabind库中如何执行/执行此隐式转换的方式。

2019-01-11 22:05:19