我正在建立一个网络协议,我想对我的消息结构使用静态多态性。 一些消息:
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 << ")";
}
};
每条消息都有一个唯一的标识符(id /操作码),我想将它们存储在一个映射中,并且能够在运行时实例化它们,因为他们知道它们没有任何基类。所以我想知道静态多态性是否可能。
尽管我涉及函子,但在尝试声明函子时总是遇到问题,因为它们没有任何父代,所以我无法指定类型。
也许这可以说明我的问题:
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
在没有父类的情况下,这终于有可能做我想要的吗?