用于脚本定义类型的自定义RTTI
Custom RTTI for use in script-defined types
我正在用c++开发一个允许Python脚本的游戏引擎。以下是如何在Python中定义函数的示例,当某个事件发生时,事件管理器将调用这些函数:
# Import some classes defined in C++
from cpp.event import PlayerDiesEvent, EventManager
def onPlayerDeath(event):
pass
em = EventManager()
em.connect(PlayerDiesEvent, onPlayerDeath)
em.post(PlayerDiesEvent(...)) # Will call `onPlayerDeath`
用户还可以定义新的事件类型:
from cpp.event import Event, EventManager
class CustomEvent(Event):
pass
def onCustomEvent(event):
pass
em = EventManager()
em.connect(CustomEvent, onCustomEvent)
em.post(CustomEvent())
然而,我还希望消息传递系统能够处理继承,目前它还没有。我的意思是:
from cpp.event import PlayerDiesEvent, EventManager
class CustomEvent(PlayerDiesEvent):
pass
def onPlayerDeath(event):
pass
def onCustomEvent(event):
pass
em = EventManager()
em.connect(PlayerDiesEvent, onPlayerDeath)
em.connect(CustomEvent, onCustomEvent)
# This notifies both functions, because `CustomEvent` is a `PlayerDiesEvent`
em.post(CustomEvent(...))
# This notifies only `onPlayerDeath`
em.post(PlayerDiesEvent(...))
tld;dr:是否有任何c++库可以让我更容易地创建一个与继承一起工作的自定义RTTI系统?如果没有,有什么想法可以让我更容易和更普遍地实现它(最好是用一种与我的实际用例无关的方式)?
我不熟悉boost::python;它可能有一些功能,使这更容易。我只知道一个定制的RTTI系统,它运行得很好:
Qt有一个元对象系统,其中反射和一定程度的动态行为是通过与每个类关联的元对象来添加的,该元对象知道该类的祖先和方法。这有点像Python的类对象。虚拟方法用于从实例中获取元对象。使用自定义编译器生成这些文件。
Qt的Python绑定也会为Python类创建这些元对象,就元对象系统而言,使它们看起来几乎与原生QObjects类相同。
你需要比Qt的一般解决方案少一点(你不需要关于方法/属性的信息)。因此,您可以使用c++类定义宏来存储有关类祖先的信息,而不是自定义编译器。然后在创建Python子类时更新来自__metaclass__
的信息,并在调度消息时查询它。
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 参数化自定义CMake工具链
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何在自定义类中启用'auto loops'?
- 使用QJsEngine在Qt中注册自定义类型
- Qt自定义QPush按钮未显示在布局上
- 自定义对象的dlib序列化在gcc中失败
- 使用模板自定义 RTTI 信息
- 用于脚本定义类型的自定义RTTI