Я строю сетевой протокол, и я хочу использовать статический полиморфизм для своих структур сообщений.Некоторые сообщения:
struct HelloConnectMessage {
void serialize(BinaryWriter &writer) const {
}
void deserialize(BinaryReader &reader) {
}
std::ostream &dump(std::ostream &o) const {
return o << "HelloConnectMessage()";
}
};
struct TestMessage {
boost::uint16_t foo;
void serialize(BinaryWriter &writer) const {
writer.writeUshort(foo);
}
void deserialize(BinaryReader &reader) {
foo = reader.readUshort();
}
std::ostream &dump(std::ostream &o) const {
return o << "TestMessage(foo=" << foo << ")";
}
};
Каждое сообщение получило уникальный идентификатор (идентификатор / код операции), и я хотел бы сохранить их на карте и иметь возможность скопировать их во время выполнения, зная, что у них нет базового класса.,Поэтому мне было интересно, возможно ли это при статическом полиморфизме.
Я думаю о функторах, но у меня всегда возникала проблема при попытке объявить, я не могу указать тип, так как у них нет родителя.
Может быть, это может проиллюстрировать мою проблему:
using opcode = std::uint16;
std::unordered_map<opcode, ?generic_type?> _protocol;
Я думаю, я мог бы заменить? Generic_type?по шаблону класса, но это сложно, так как я не могу поместить шаблон в переменную члена класса.Я также думаю о фабрике, но у меня все еще есть проблема базового типа.
template<class T>
std::unique_ptr<?generic_type?> messageFactory() {
return std::make_unique<T>();
}
std::unordered_map<opcode, std::unique_ptr<?generic_type?>(*)()> _protocol;
_protocol[1] = messageFactory<HelloConnectMessage>(); // example
Возможно ли, наконец, сделать то, что я ищу, без родительского класса?