Pregunta

Muchas gracias por su tiempo, realmente lo aprecio

Hay una subclase templatizada que debe ser serializada con la biblioteca de serialización de cereales, la BASECLASS está vacía, solo existe, por lo que podemos tener un vector de Shared_PTR a la clase base, lo que le permite contener múltiples tipos de la subclase templatized, permitiendo efectivamente el almacenamiento vectorial de múltiples tipos de variables.

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;
};

Se presiona el siguiente vector de la Basellass:

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'));

Finalmente, el vector está serializado y enviado a una máquina remota para su procesamiento:

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

Debo faltar una pieza de llave al rompecabezas porque cuando desialización de los datos, el programa, el programa arroja una excepción, si depago los valores de las variables de salida son números negativos en blanco o grandes que me llevan a creer la Basellass y o Subclase no se está volviendo serializado correctamente.

El código se ha simplificado solo para exponer el problema, para obtener más información sobre la idea completa, puede consultar a esta pregunta aquí.

Se están incluyando los siguientes encabezados de cereales:

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

Estoy seguro de que necesitaré más, ya que empiezo a agregar más tipos de datos a la Basellass.

Si alguien tiene alguna idea de lo que está pasando aquí, lo apreciaría mucho.

Gracias de nuevo por su tiempo.

¿Fue útil?

Solución

No tiene la opción aquí, el polimorfismo necesita virtualidad cuando solo tiene acceso a una interfaz de clase base.Previene también el archivo para ser un tipo de plantilla.

Me imagino que el cereal está haciendo algo de Sfinae para probar la existencia del método Serialize y tener un comportamiento predeterminado si no se encuentra.Ese sería el caso aquí, ya que no tiene un error de compilación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top