Est-il sûr de sérialiser un coup de pouce brute :: variante?
-
19-09-2019 - |
Question
boost :: variante affirme que il est un type de valeur. Est-ce que cela signifie qu'il est sûr de simplement écrire la représentation brute d'un boost :: variante et le charger de nouveau plus tard, tant qu'il ne contient que les types POD? On suppose qu'il sera rechargé par le code compilé par le même compilateur, et même version de boost, sur la même architecture.
En outre, (probablement) de manière équivalente, peut stimuler :: variante être utilisée en mémoire partagée?
La solution
En ce qui concerne la sérialisation: Il devrait fonctionner, oui. Mais pourquoi ne pas utiliser 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 le dites, ce qui précède est valable uniquement si la variante ne peut contenir que les types POD.
Autres conseils
Essayez tout y compris boost / sérialisation / variant.hpp; il fait le travail pour vous.