$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: quendezus (quendez_at_[hidden])
Date: 2002-02-28 12:16:54
--- In boost_at_y..., johan.nilsson_at_e... wrote:
>
> To keep as non-intrusive as possible, it would be possible to
support
> specialized marshallers to support non-default constructors -
thereby
> allowing legacy objects to be marshalled, e.g.:
>
> on reading:
>
> ... gps_position_marshaller::read(T& ar, ...)
> {
> X par1, par2;
> ar >> par1 >> par2;
> gps_position* pos = new gps_position(par1, par2);
> ...
> }
>
> // Johan
>
The problem is that you can not always express deserialization as an
existing constructor call. See the code below :
struct C
{
A a_; // An attribute of type A
B b_; // An attribute of type B
C veryHardToComputeValue_; // An attribute of type C
C( const A& a, const B& b ) : a_( a ), b_( b )
{
// Very long computing
veryHardToComputeValue_.compute( a, b );
}
};
void save( Archive& a, const C& c )
{
a << c.a_;
a << c.b_;
a << veryHardToComputeValue_;
}
void load( Archive& a, C& c )
{
a >> c.a_;
a >> c.b_;
a >> veryHardToComputeValue_;
}
In that case you do not have any constructor to call and pass
veryHardToComputeValue as a parameter. Even if you could modify the
class to add a constructor that would take A&, B& and C&, you could
have problem to pass the C& parameter because maybe you don't want to
copy it or deal with allocation of that parameter.
Sylvain