Boost logo

Boost :

From: Reece Dunn (msclrhd_at_[hidden])
Date: 2004-03-30 14:06:00


>From: Rob Stewart <stewart_at_[hidden]>
>From: "Reece Dunn" <msclrhd_at_[hidden]>
> > So the errorcheck object will be in a half-constructed state. That is,
>the
> > int will be constructed, but the errorcheck object isn't, therefore the
> > int's destructor will be called, but errorcheck's deconstructor will
>not.
> >
> > The solution would therefore be to throw an intermediate object, like
>the
> > Trules from the C++ Templates book by David Vandervoorde and Nico
>Josuttis.
> > This would then get around the throwing in a constructor problem.

>Why not throw a new errorcheck object using a private ctor that
>stores but doesn't check the return value?

That would work (I realised an implementation after the post). But this is
what I was trying to achieve using the copy constructor (and copy
assignment), since that copies the object, but does not throw on failure.

The errorcheck class now has a policy-based implementation, so it would look
something like:

   template< typename ErrorStorage, typename ErrorMsgStorage >
   class errorcheck: public Storage, public MsgStorage
   {
      private:
         inline errorcheck( const Storage & s, const MsgStorage & ms ):
            Storage( s ), MsgStorage( ms )
         {
         }
      public:
         inline errorcheck( typename Storage::error_type e ):
            Storage( e ), MsgStorage()
         {
            if( failed())
               throw( errorcheck< Storage, MsgStorage >( *this, *this ));
         }
   };

which, IMHO, is more confusing than the straight throw( *this ), but does
not use the copy constructor, relying instead of the fully constructed
Storage and MsgStorage base classes.

Regards,
Reece

_________________________________________________________________
Find a cheaper internet access deal - choose one to suit you.
http://www.msn.co.uk/internetaccess


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk