Пользовательский RTTI для использования в сценариях определенных типов - PullRequest
1 голос
/ 30 октября 2011

Я разрабатываю игровой движок на 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, которая работает с наследованием? Если нет, есть какие-нибудь идеи, как я мог бы реализовать это более легко и, возможно, более широко (предпочтительно таким образом, который не зависит от моего фактического варианта использования)?

1 Ответ

1 голос
/ 30 октября 2011

Я не знаком с boost :: python; это может иметь некоторую особенность, которая делает это проще. Я просто знаю о специальной системе RTTI, которая работает довольно хорошо:

Qt имеет систему мета-объектов , где отражение и степень динамического поведения добавляются с помощью метаобъекта , связанного с каждым классом, который знает предки и методы этого класса. Это как объекты класса Python. Виртуальный метод используется для получения метаобъекта из экземпляров. Для их генерации используется пользовательский компилятор .

Qt's Python привязки затем также создают эти метаобъекты для классов Python, делая их почти идентичными родным классам QObjects в отношении системы мета-объектов.


Вам нужно немного меньше, чем общее решение Qt (вам не нужна информация о методах / свойствах). Таким образом, вместо пользовательского компилятора вы можете использовать макрос определения класса C ++, который хранит информацию о предках класса. А затем также обновите информацию из __metaclass__ при создании подкласса Python и запросите ее при отправке сообщения.

...