Вопрос

Большое спасибо за ваше время, я действительно ценю это

Существует множественный подкласс, который должен быть сериализован с библиотекой сериализации зерновых, базовый класс пустой, он только существует, поэтому мы можем иметь вектор Shared_ptr к базовому классу, что позволяет проводить несколько типов субкласс, эффективно разрешение вектора хранения нескольких типов переменной.

class NetVar_ {};
template <class VARTYPE> class NetVar : public NetVar_
{
public:
    NetVar(VARTYPE Value)
    {
        Var = Value;
    }

    template <class Archive> void serialize(Archive & archive)
    {
        archive(Var);
    }

private:
    VARTYPE Var;
};
.

Следующий вектор базовой базовой массы нажимается несколько подклассов:

std::vector<std::shared_ptr<NetVar_>> PacketData;
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<std::string>>('test'));
.

Наконец, вектор сериализуется и отправляется на удаленный компьютер для обработки:

std::ostringstream SData;
{
    cereal::PortableBinaryOutputArchive Archive(SData);
    Archive(PacketData);
    //SData is sent to remote machine here through networking library.
}
.

Я должен отсутствовать в ключевой части к головоломку, потому что когда я децерелю данные, которые программа бросает исключение, если я отладку значения выходных переменных - это либо пустые, либо большими отрицательными числами, которые ведут мне верить базовому материалу и или Подкласс не требует сериала.

Код был упрощен вниз, чтобы выдержать проблему только для получения дополнительной информации о полной идее, вы можете ссылаться к этому вопросу здесь.

Следующие заголовки злаков входят:

#include <cereal\archives\portable_binary.hpp>
#include <cereal\types\vector.hpp>
#include <cereal\types\memory.hpp>
#include <cereal\types\string.hpp>
.

Я уверен, что мне нужно больше, когда я начинаю добавлять больше типов данных в базовый класс.

Если у кого-то есть идеи, что происходит здесь, я бы очень признателен.

Спасибо снова за ваше время.

Это было полезно?

Решение

У вас нет выбора здесь, полиморфизм нуждается в виртуальности, когда у вас есть только доступ к интерфейсу базового класса.Предотвращает также архивирующую тип шаблона.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top