Если набор сообщений известен заранее (передача / получение), а не полиморфизм, рассмотрим вариантный тип, я беру конкретно о boost::variant<>
.
Преимущество этого подхода заключается в том, чтокаждое сообщение имеет определенный тип (я знаю, что кажется, что вы не хотите реализовывать это - однако, как долгосрочное средство проектирования, я думаю, вы найдете этот подход расширяемым), и вариант описываетнабор сообщений, позвольте мне показать быстрый пример:
скажем, у меня есть два сообщения
struct Logon{};
struct Logout{};
Я определяю вариант для хранения возможного набора сообщений, в данный момент времени это толькокогда-нибудь один из них ..
typedef boost::variant<Logon, Logout> message_type;
Теперь я могу хранить это в любом контейнере и передавать его как обычно, единственное отличие состоит в том, что действительно общий способ получить к ним доступ через посетителей, например
struct process : boost::static_visitor<>
{
void operator()(Logon const& cLogon)
{
// do stuff
}
void operator()(Logout const& cLogout)
{
// do stuff
}
};
// method that processes a given message
void processMessage(message_type const& cMsg)
{
// don't know what this message is, that's fine, hand it to the visitor
boost::apply_visitor(process(), cMsg); // the correct overload will be called for the message
}
... Я думаю, что это немного лучше, чем void*
;)