2009-07-28 6 views
6

boost::variant affirme qu'il s'agit d'un type de valeur. Cela signifie-t-il qu'il est sûr de simplement écrire la représentation brute d'un boost :: variant et de le recharger plus tard, à condition qu'il ne contienne que des types POD? Supposons qu'il sera rechargé par le code compilé par le même compilateur, et la même version de boost, sur la même architecture.Est-il prudent de sérialiser un boost :: variant brut?

De plus, (probablement) de manière équivalente, boost :: variant peut-il être utilisé dans la mémoire partagée?

+1

Cracher la représentation de la mémoire brute, même si c'est juste une structure de PODs, est une mauvaise idée, et vous soumet à la pitié de la disposition de remplissage de votre compilateur, les détails de l'architecture et l'endianness. – Thanatos

+0

A l'époque, je m'intéressais plus à l'utilisation de la mémoire partagée, dans laquelle les différences de mise en page n'allaient pas poser de problème du tout. – bdonlan

Répondre

6

En ce qui concerne la sérialisation: Cela devrait fonctionner, oui. Mais pourquoi n'utilisez-vous pas le mécanisme de visite de boost::variant pour écrire le type réel contenu dans 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 ce qui concerne la mémoire partagée: boost::variant ne fonctionne pas les allocations de tas, de sorte que vous pouvez le placer dans la mémoire partagée comme un int, en supposant une synchronisation correcte, bien sûr. Inutile de dire que, comme vous l'avez dit, ce qui précède n'est valable que si la variante ne peut contenir que des types POD.

+0

Je voudrais éviter d'écrire beaucoup de code passe-partout pour écrire ces types réels :) – bdonlan

+0

pas beaucoup de code passe-partout nécessaire; voir ci-dessus –

14

Essayez simplement d'inclure boost/serialization/variant.hpp; ça fait le travail pour toi.

+0

Est-ce que cela fonctionne aussi pour les types POD? comme std :: string – SeniorLee

+0

vues comme boost :: variant a été fait pour les types non POD (sinon vous pourriez utiliser un syndicat étiqueté), je suppose que oui, mais un test rapide confirmerait. – spiderlama

Questions connexes