luabind 如何隐式强制转换对象
How does luabind implicitly cast objects?
在不涉及我正在处理的大型多库项目的情况下,我想问一个关于其中发生的特定事件的问题。 我正在使用 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
特定实例的类独有的功能。它是如何做到的? 它如何获取小部件指针并自动知道特定的小部件是一个按钮? 我不相信这是可能的,所以我花了一段时间才得出那个解决方案,但我想我会在黑暗中拍摄,它以某种方式起作用。
你问已经很久了,但我可能有一个答案......
- Luabind 为您启动可执行文件时注册的每种类型生成内部唯一 ID(+ 包装器等...
- LUA_REGISTRYINDEX中有一个名为__luabind_class_id_map全局"映射",用于将类型ID转换为先前分配的内部唯一ID
- 当你返回指针(GuiWidget(时,luabind通过取消引用来询问返回指针的类型id->typeid(ptr(。这令人惊讶地返回了 GuiButton 的type_info而不是 GuiWidget(尽管 GuiWidget ptr = new GuiButton((;)
- 然后luabind将GuiButton的类型ID转换为内部ID,并在另一个LUA_REGISTRYINDEX表(__luabind_class_map(中找到class_rep.class_rep保存对象应该如何在Lua端存储以及与注册的c ++类相关的其他信息。
使其正常工作的最后一个有趣信息是,Lua 端的所有指针都存储如下:dynamic_cast(ptr( 稍后允许从该类自动转换为使用以前的方法验证的其他类,并在class_rep中继承信息
这大致就是在luabind库中完成/完成这种隐式转换的方式。
相关文章:
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 将父类对象强制转换为子类的问题
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 已转换对象的地址
- 如何在OpenGL中使用关键事件来转换对象
- 使用父类实例化的向下转换对象
- 静态强制转换允许转换对象指针,但不允许转换整数
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 找到对象类型后,是否可以使用 static_cast 强制转换对象
- 旨在复制/转换对象的功能系列的模板
- luabind 如何隐式强制转换对象
- 转换对象
- 使用隐式可转换对象调用move重载函数时的编译错误
- 关于在 cpp 中转换对象的两个问题
- 在运行时根据实例变量强制转换对象(c++)
- 使用用户定义的类型强制转换对象
- 在c++中转换对象
- 从"int"到非标量类型赋值运算符的转换 - 对象到 int
- 在屏幕上转换对象可编程管道
- 在 C 样式类型转换期间,关于强制转换对象的地址空间的实际情况