я создал упрощенную систему обработки событий, описываемую следующими классами
IEventType - containing string name and hashed int value of the name for fast search
IEventData - data send along with a triggered event
EventManager - containing a std::map of <int, boost::signals2< bool( boost::shared_ptr< IEventData > ) >
(есть и другие слушатели для побочных событий сценария lua и других, но я думаю, что сейчас это неактуально)
Реальная проблема заключается в следующем: когда я получаю IEventData, скажем:
class EData_WriteToConsole : IEventData
{
std::string text;
int layer;
...
}
, тогда я регистрирую некоторую функцию-член для сигнала:
OnWriteToConsole( boost::shared_ptr< IEventData > ){ ... }
m_EventManager->AddListener(boost::bind(&Console::OnWriteToConsole, m_Console, _1));
, а затем использую функцию TriggerEvent в EventManager
boost::shared_ptr< EData_WriteToConsole > eventData(new EData_WriteToConsole("Text..", 1));
m_EventManager->TriggerEvent(eventData);
наконец-то мое событие инициируется: но я не могу получить доступ к данным конкретного события EData_WriteToConsole, потому что OnWriteToConsole получает только базовый класс IEventData ptr.
, поэтому мне нужно уменьшить IEventData, который повышает ::shared_ptr указывает на производный класс EData_WriteToConsole.
В настоящее время я застрял, потому что мой мозг не выспался в последние дни, и я просто не могу придумать решение без уныния. Есть ли способ обойти это, могу ли я как-то реструктурировать свою иерархию классов, чтобы мне не нужно было выгружать? (я думал о создании std :: map с данными, которые передаются как eventdata, так и получающая функцияможет искать вещи, которые ему нужны, но для меня это кажется медленным и глупым), пожалуйста, помогите