luabind 如何隐式强制转换对象

How does luabind implicitly cast objects?

本文关键字:转换 对象 何隐式 luabind      更新时间:2023-10-16

在不涉及我正在处理的大型多库项目的情况下,我想问一个关于其中发生的特定事件的问题。 我正在使用 Luabind 将我的 C++ 代码接口与我的 Lua 代码一起使用,并且我有一个具有继承的类结构,如下所示:

吉小部件

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全局"映射",用于将类型ID转换为先前分配的内部唯一ID
  3. 当你返回指针(GuiWidget(时,luabind通过取消引用来询问返回指针的类型id->typeid(ptr(。这令人惊讶地返回了 GuiButton 的type_info而不是 GuiWidget(尽管 GuiWidget ptr = new GuiButton((;)
  4. 然后luabind将GuiButton的类型ID转换为内部ID,并在另一个LUA_REGISTRYINDEX表(__luabind_class_map(中找到class_rep.class_rep保存对象应该如何在Lua端存储以及与注册的c ++类相关的其他信息。

使其正常工作的最后一个有趣信息是,Lua 端的所有指针都存储如下:dynamic_cast(ptr( 稍后允许从该类自动转换为使用以前的方法验证的其他类,并在class_rep中继承信息

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