【问题标题】:Custom RTTI for use in script-defined types用于脚本定义类型的自定义 RTTI
【发布时间】:2011-12-18 03:14:23
【问题描述】:

我正在用 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 系统?如果没有,有什么想法可以让我更轻松、更普遍地实现这一点(最好以与我的实际用例无关的方式)?

【问题讨论】:

  • C++ 中已经存在的 RTTI 有什么问题?它如何满足您的需求?
  • @Nicol 从 C++ 的角度来看,Python 类型只是 PyObject(或 boost::python::object)的实例,因此原生 RTTI 并不好。它怎么可能起作用? C++ 的 RTTI 仅适用于编译时的 C++ 类型,而不是运行时的 Python。

标签: c++ python rtti boost-python


【解决方案1】:

我不熟悉 boost::python;它可能具有一些使这更容易的功能。我只知道一个运行良好的自定义 RTTI 系统:

Qt 有一个meta-object system,其中反射和一定程度的动态行为是通过与每个知道该类的祖先和方法的类关联的metaobject 来添加的。这有点像 Python 的类对象。虚拟方法用于从实例中获取元对象。 custom compiler 用于生成这些。

Qt 的Python bindings 还会为 Python 类创建这些元对象,就元对象系统而言,它们看起来与原生 QObjects 类几乎相同。


您需要的比 Qt 的一般解决方案要少得多(您不需要有关方法/属性的信息)。因此,您可以使用 C++ 类定义宏来代替自定义编译器,该宏存储有关类的祖先的信息。然后在创建 Python 子类时更新来自__metaclass__ 的信息,并在您发送消息时对其进行查询。

【讨论】:

  • Qt 解决方案似乎很有趣。我会研究它,如果我发现它太复杂,也许我会制作它的精简版以在我的代码中使用。
猜你喜欢
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多