Domanda

Grazie mille per il tuo tempo lo apprezzo davvero

C'è una sottoclasse templatizzata che deve essere serializzata con la libreria di serializzazione dei cereali, il baselles è vuoto, esiste solo in modo da poter avere un vettore di shared_ptr alla classe base che consente di contenere più tipi di sottoclasse templatizzata, che consente efficacemente la memorizzazione vettoriale di più tipi di variabili.

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

Il seguente vettore del Baseclass viene spinto alcune delle sottoclassi:

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

Infine, il vettore è serializzato e inviato a una macchina remota per l'elaborazione:

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

Devo mancare un pezzo chiave al puzzle perché quando sarò i dati, il programma lancia un'eccezione, se debug dei valori delle variabili di uscita sono numeri vuoti o grandi che mi portano a credere al basello e La sottoclasse non viene serializzata correttamente.

Il codice è stato semplificato per esporre solo il problema, per ulteriori informazioni sull'idea completa è possibile fare riferimento a A questa domanda qui.

Le seguenti intestazioni cereali sono incluse:

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

Sono sicuro che avrò bisogno di più mentre comincio ad aggiungere altri tipi di dati nel basello.

Se qualcuno ha qualche idea, cosa sta succedendo qui, lo apprezzerei molto.

Grazie ancora per il tuo tempo.

È stato utile?

Soluzione

Non hai la scelta qui, il polimorfismo ha bisogno della virtualità quando si accede solo a un'interfaccia di classe base.Previene anche l'archivio di essere un tipo di modello.

Immagino che i cereali stiano facendo alcuni sfinae per testare l'esistenza del metodo serializzato e avere un comportamento predefinito se non trovato.Questo sarebbe il caso qui come non hai errore di compilazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top