Msgpack: упаковать подкласс из базового класса. - PullRequest
0 голосов
/ 18 марта 2020

У меня есть абстрактный базовый класс Serializable, где я хотел бы реализовать метод Serialize для всех унаследованных от него классов. Пример кода ниже:

struct Serializable
{
    std::string Serialize() {
        std::stringstream ss;
        msgpack::pack(&ss, *this);
        return ss.str();
    }
};

struct DataType : public Serializable
{
    int value;

    MSGPACK_DEFINE(value);
}

std::string str = DataType{10}.Serialize();

Но код не компилируется. Я предполагаю, что в методе Serializable :: Serialize () библиотека Msgpack не могла понять MSGPACK_DEFINE, определенный в структуре DataType.

Я предполагаю, что создание метода Serialize stati c и generi c решит проблему. Но есть ли способ сериализации объекта в базовом классе? Как бы вы это реализовали?

Обновление : я вижу, что полиморфизм stati c решает проблему ..

template<typename Derived>
struct Serializable
{
    std::string Serialize() {
        std::stringstream ss;
        msgpack::pack(&ss, *static_cast<Derived*>(this));
        return ss.str();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...