|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2004-11-22 11:05:49
Richard Peters wrote:
> Hello,
>
> I'm looking for a way to serialize a variant. I see two possibly
> difficult things that I don't know how to accomplish: 1) In order to
> be able to retrieve a variant from an archive, the type of the value
> held by the
> variant must be stored. 2) When retrieving the data from an archive,
> once
> the type is read, a value of that type must be extracted from the
> archive
> and assigned to the variant. Has anybody tried this before, is this as
> difficult as it looks? Any help would be greatly appreciated.
I would expect the external representation of a variant<T1, ..., Tn> to be:
int index;
Ti ti;
where index denotes the type and is returned by varant<>::which().
Assuming a variant<int, string> for simplicity, the save pseudocode should
be something like:
int index = v.which();
ar << v;
switch( v )
{
case 0: ar << get<int>( v ); break;
case 1: ar << get<string>( v ); break;
}
You can rewrite it generically in terms of apply_visitor:
struct variant_saver
{
typedef void result_type;
template<class A, class T> void operator( A & a, T const & t ) const
{
a << t;
}
};
apply_visitor( bind( variant_saver(), ref(ar), _1 ), v );
Disclaimer: I haven't compiled any of this. ;-)
Loading should be the reverse operation:
int index;
ar >> index;
switch( index )
{
case 0: { int t; ar << t; v = t; break; }
case 1: { string t; ar << t; v = t; break; }
}
This, of course, belongs in variant.hpp. Don't let our shared_ptr debates
fool you. :-)
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk