用于脚本定义类型的自定义RTTI

Custom RTTI for use in script-defined types

本文关键字:自定义 RTTI 类型 脚本 定义 用于      更新时间:2023-10-16

我正在用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__的信息,并在调度消息时查询它。