2009-07-28 8 views
6

boost::variant afirma que es un tipo de valor. ¿Esto significa que es seguro simplemente escribir la representación raw de una variante boost :: y volver a cargarla más tarde, siempre que solo contenga tipos POD? Supongamos que será recargado por código compilado por el mismo compilador y la misma versión de boost en la misma arquitectura.¿Es seguro serializar una variante raw boost ::?

Además, (probablemente) de manera equivalente, puede impulsar :: la variante se utiliza en la memoria compartida?

+1

Extender la representación de memoria sin formato, incluso si es solo una estructura de POD, es una idea pobre y le somete a la merced del diseño de relleno del compilador, los detalles de la arquitectura y la permanencia. – Thanatos

+0

En ese momento estaba más interesado en el uso compartido de memoria, en el que las diferencias en el diseño no iban a ser un problema en absoluto. – bdonlan

Respuesta

6

En cuanto a la serialización: Debería funcionar, sí. ¿Pero por qué no usa el mecanismo de visitas boost::variant para escribir el tipo real contenido en la 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; 
} 

En cuanto a la memoria compartida: boost::variant no realiza asignaciones del montón, por lo que se puede colocar en la memoria compartida al igual que un int, suponiendo una correcta sincronización, por supuesto.

No hace falta decir que, como usted dijo, lo anterior solo es válido si la variante solo puede contener tipos de POD.

+0

Me gustaría evitar escribir un montón de código repetitivo para escribir dichos tipos reales :) – bdonlan

+0

no se necesita mucho código repetitivo; ver arriba –

14

Intente simplemente incluir boost/serialization/variant.hpp; hace el trabajo por ti.

+0

¿Funciona esto también para los tipos de POD? como std :: string – SeniorLee

+0

seeings :: boost se hizo para tipos no POD (de lo contrario podría usar una unión etiquetada), supongo que sí, pero una prueba rápida lo confirmaría. – spiderlama

Cuestiones relacionadas