$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Robert Ramey (ramey_at_[hidden])
Date: 2003-10-12 23:51:04
David Abrahams wrote:
>> template<class Archive ar, class T>
>> void load(Archive & ar, T * &t, unsigned int file_version)
>> {
>> t = NULL;
>> try{
>> t = new T();
>> ar >> *t;
>> }
>> catch(...){
>> delete t;
>If you were to do it this way, you should do "t = NULL" here instead,
>but...
won't this leak memory if ar >> *t throws an exception?
>> throw;
>> }
>> }
>
>using a T*& out parameter makes no sense whatever to me, and
>just seems to complicate matters, though of course I might have missed
>something important... ohh, are you using it for overload resolution
>so that users can provide an overload?
>Using the same T* for both >purposes like that prevents functional programming
would you like to expand upon that?
>I would prefer, e.g.:
>template<class T, class Archive ar> // but see below
>T* load(Archive & ar, unsigned int file_version)
>{
> std::auto_ptr<T> t(new T());
> ar >> *t;
> return t.release();
>}
hmm .. would you buy:
template<class Archive ar, class T> // but see below
load(Archive & ar, T * & t, unsigned int file_version)
{
t = NULL;
std::auto_ptr<T> ta(new T());
ar >> *ta;
t = ta.release;
}
>// Detection for operator new and operator delete
[snip]
wow - that' s mouthful - it will take a while for me to digest that.
>> So, in light of the above, I'm not convinced that any change would be beneficial.
>That may still be true, though I'm not sure. It seems like the
>ability to override inplace construction is important for
>deserializing arrays.
array objects are never created by the serialization system.
The default array handling
ar >> array
resolves to
for each item in array
ar >> item
There may be cases where this default handling is inapplicable.
In such cases the above default de-serialization of such an array will have
to be overridden with something presumably more elaborate.
Robert Ramey