我正在用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系统?如果没有,任何想法如何更容易实现,也许更普遍(最好以与我的实际用例无关的方式)?
答案 0 :(得分:1)
我不熟悉boost :: python;它可能有一些功能,使这更容易。我只知道一个非常好的自定义RTTI系统:
Qt有meta-object system,其中通过与知道该类的祖先和方法的每个类关联metaobject来添加反射和一定程度的动态行为。它有点像Python的类对象。虚方法用于从实例获取元对象。 custom compiler用于生成这些。
Qt的Python bindings然后还为Python类创建了这些元对象,使它们看起来与本地QObjects类几乎相同,就元对象系统而言。
您需要比Qt的一般解决方案少得多(您不需要有关方法/属性的信息)。因此,您可以使用C ++类定义宏代替自定义编译器,该宏存储有关类的祖先的信息。然后还在创建Python子类时更新__metaclass__
中的信息,并在发送消息时查询它。