Шаблон проектирования, позволяющий избежать потери при передаче сообщений

Базовый класс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? Каким будет шаблон проектирования, который позволяет каждому обработчику работать со своими поддерживаемыми объектами сообщений?

Ответы на вопрос(3)

Ваш ответ на вопрос