расширенный статический полиморфизм - PullRequest
0 голосов
/ 01 октября 2018

Я строю сетевой протокол, и я хочу использовать статический полиморфизм для своих структур сообщений.Некоторые сообщения:

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

Возможно ли, наконец, сделать то, что я ищу, без родительского класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...