高级静态多态性

时间:2018-10-01 20:26:04

标签: c++ polymorphism

我正在建立一个网络协议,我想对我的消息结构使用静态多态性。 一些消息:

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

在没有父类的情况下,这终于有可能做我想要的吗?

0 个答案:

没有答案