Рассмотрим следующее
struct Message
{
Message() : description("Generic message") {}
Message(const std::string& d) : description(d) {}
std::string description;
};
struct MessageType1 : public Message
{
MessageType1() : Message("MessageType1"), a_boolean(false) {}
bool a_boolean;
};
// more specific Message types
class AbstractMessagePasser
{
public:
virtual ~AbstractMessagePasser();
void receive(const Message& m) {}
};
class Component1
{
AbstractMessagePasser* m_fwd;
public:
template<class M>
void send(const M& m)
{
m_fwd->receive(m);
}
};
// more classes like Component1 with a pointer to an AbstractMessagePasser
class MessagePasser : public AbstractMessagePasser
{
Component1* cp1;
Component2* cp2;
using AbstractMessagePasser::receive;
// overloads of AbstractMessagePasser::receive() for different message types
void receive(const MessageType1&)
{
// do something
}
void receive(const MessageType2&)
{
// do something different
}
};
Словом, у меня есть некоторые компоненты, связь между ними осуществляется с использованием различных производных типов Message
.Все сообщения должны быть обработаны в MessagePasser
.Для этого я бы хотел, чтобы MessagePasser
вызывал правильную перегрузку receive()
, когда компонент отправляет Message
, т.е. если компонент вызывает send(const MessageType1&)
, тогда receive(const MessageType1)
следует вызывать в MessagePasser
.Однако версия базового класса всегда вызывается.
Я также безуспешно пытался специализировать шаблоны (создание шаблонов receive
в AbstractMessagePasser
. Есть ли простой способ сделать это?