Вы можете использовать std::map<short,std::function<std::unique_ptr<Message> (BitStream& data)>
и разрешить динамическую регистрацию этих фабричных функций:
std::map<short,std::function<std::unique_ptr<Message> (BitStream& data)> createMessageHandlers;
void registerCreateMessageHandler(short id,std::function<std::unique_ptr<Message> (BitStream& data)> fn) {
createMessageHandlers[id] = fn;
}
и используйте его как
registerCreateMessageHandler(1, [](BitStream& data) { return std::make_unique<FirstMessage>();});
registerCreateMessageHandler(2, [](BitStream& data) { return std::make_unique<SecondMessage>();});
Ваши конструкторы типов сообщений, вероятно, должны принять BitStream&
в качестве параметра конструктора.
Вам следует подумать об использовании такого инструмента, как буферы протокола Google , для определения ваших протоколов связи.
Это очень помогло бы в правильном версионировании и анализе пакетов сообщений (нейтральных по порядку байтов) по проводной (или беспроводной) сети.
В сочетании с, например, boost :: asio или zeromq для обработки транспортировки, что должно дать вам максимальную гибкость и надлежащие механизмы для разделения транспортного и семантического уровней коммуникации.