2009-07-28 7 views
6

boost::variant afferma che si tratta di un tipo di valore. Questo significa che è sicuro scrivere semplicemente la rappresentazione grezza di un boost :: variant e caricarlo più tardi, purché contenga solo i tipi POD? Supponiamo che verrà ricaricato dal codice compilato dallo stesso compilatore e dalla stessa versione di boost, sulla stessa architettura.È sicuro serializzare un boost raw :: variante?

Inoltre, (probabilmente) in modo equivalente, può aumentare :: la variante può essere utilizzata nella memoria condivisa?

+1

Sputare la rappresentazione della memoria grezza, anche se si tratta solo di una struttura di POD, è una pessima idea e ti mette in balia del layout del pad del compilatore, dei dettagli di architettura e di endianness. – Thanatos

+0

All'epoca ero più interessato all'utilizzo della memoria condivisa, in cui le differenze nel layout non sarebbero state affatto un problema. – bdonlan

risposta

6

Per quanto riguarda la serializzazione: dovrebbe funzionare, sì. Ma perché non usi il meccanismo di visita di boost::variant per scrivere il tipo effettivo contenuto nella variante?

struct variant_serializer : boost::static_visitor<void> { 
    template <typename T> 
    typename boost::enable_if< boost::is_pod<T>, void>::type 
    operator()(const T & t) const { 
     // ... serialize here, e.g. 
     std::cout << t; 
    } 
}; 

int main() { 

    const boost::variant<int,char,float,double> v('1'); 

    variant_serializer s; 
    boost::apply_visitor(s, v); 

    return 0; 
} 

Per quanto riguarda la memoria condivisa: boost::variant non esegue le allocazioni di heap, in modo da poter inserire in memoria condivisa proprio come un int, assumendo una corretta sincronizzazione, naturalmente.

Inutile dire che, come hai detto, quanto sopra è valido solo se la variante può contenere solo tipi di POD.

+0

Vorrei evitare di scrivere un sacco di codice di codice per scrivere i seguenti tipi effettivi :) – bdonlan

+0

non è necessario molto codice standard; vedi sopra –

14

Prova a includere solo boost/serializzazione/variant.hpp; fa il lavoro per te.

+0

Funziona anche per i tipi non POD? come std :: string – SeniorLee

+0

vedute come boost :: la variante è stata fatta per i tipi non POD (altrimenti potresti usare un'unione taggata), direi di si, ma un rapido test confermerebbe. – spiderlama

Problemi correlati