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

1 投票
1 回答
702 浏览
提问于 2025-04-17 05: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(...))

总结:有没有什么C++库可以让我更容易地创建一个支持继承的自定义RTTI系统?如果没有,有没有其他的想法,能让我更简单、更加通用地实现这个功能(最好是与我的具体使用场景无关)?

1 个回答

1

我对boost::python不太熟悉,可能它有一些功能可以让这件事变得更简单。我只知道一个自定义的RTTI系统,效果还不错:

Qt有一个元对象系统,通过为每个类关联一个元对象,可以添加反射和一定程度的动态行为。这个元对象知道这个类的祖先和方法。可以把它想象成Python的类对象。通过一个虚拟方法,可以从实例中获取这个元对象。使用一个自定义编译器来生成这些元对象。

Qt的Python 绑定也会为Python类创建这些元对象,这样在元对象系统看来,它们看起来几乎和原生的QObject类一模一样。


你需要的东西比Qt的通用解决方案少很多(你不需要关于方法/属性的信息)。所以你可以用一个C++类定义宏来存储关于类祖先的信息,而不是使用自定义编译器。然后在创建Python子类时更新这些信息,并在发送消息时查询这些信息。

撰写回答