Это довольно легко сделать.Обычно существует две альтернативы:
Boost.Variant
Вместо передачи производного класса, просто перечислите возможные типы, которыми может быть сообщение.Эти типы не должны быть производными друг от друга.Оберните эти типы в boost :: variable :
typedef boost::variant<MessageData1, MessageData2, MessageData3, ...> MessageData;
Обратите внимание, что это означает, что возможные типы данных сообщения должны быть перечисляемыми.Методы посещения Boost.Variant упрощают работу с объектами этих типов, не зная точно, какой тип он хранит.
Boost.Any
Просто передайте что-нибудь с boost::any
:
void MessageHandler::receiveMessage(const boost::any &msg)
{
const MessageType1 *pMsg = boost::any_cast<MessageType1>(&msg);
if(!pMsg)
//Cannot process
return;
//Process message.
}
boost::any
по типу безопасен void*
.Он запоминает точный тип, который был вставлен в него, и любая попытка привести его к чему-то другому , чем то, что хранится в нем, потерпит неудачу.boost::any
может хранить что угодно, отсюда и имя.
Он также имеет семантику значений, поэтому его можно копировать, как его содержимое.