Базовый класс MessageHandler
имеет производные классы. Они хотели бы передавать сообщения друг другу. Сообщения могут относиться к разным классам, но могут быть созданы для совместного использования базового класса. Как каждый MessageHandler
может избежать понижения качества полученного сообщения? Можно ли как-то сделать что-то, что приведет к параметризации шаблона виртуальной функции receiveMessage
в MessageHandler?
По сути, я пытаюсь заменить следующий код чем-то, что не понижается, и, надеюсь, это вещь времени компиляции:
// ...
virtual void MessageHandler::receiveMessage(Message &msg) = 0;
// ...
// to receive a message
void DerivedMessageHandler::receiveMessage(Message& msg)
{
switch (msg.MsgType()) // enum
{
case Message::MessageType::A:
MessageA& = dynamic_cast<MessageA&>(msg);
break;
case Message::MessageType::B:
MessageB& = dynamic_cast<MessageB&>(msg);
break;
default:
// don't process unknown messages
break;
}
}
// to send a message
list<MessageHandler> mhList;
// populate list
for (MessageHandler& mh : mhList)
{
mh.receiveMessage(msg);
}
Я знаю, что не могу этого сделать, но что-то вроде
template <typename M>
void MessageHandler::receiveMessage(M& msg) {}
И сделать так, чтобы каждый DerivedMessageHandler
специализировался на M
? Каким может быть шаблон проектирования, который позволяет каждому обработчику работать с поддерживаемыми им объектами сообщений?