Boost logo

Boost :

From: Reece Dunn (msclrhd_at_[hidden])
Date: 2004-03-30 16:29:08


Rob Stewart wrote:
>From: "Reece Dunn" <msclrhd_at_[hidden]>
> > 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.
>
>I wouldn't call it confusing, though I'd expect that you'd need
>to document why you couldn't do the more obvious thing.

I mean confusing in that you have errorcheck( *this, *this ) so it is harder
to see what is going on. I have added a comment line explaining why this is
done and would also put this in the docs.

>I do have to ask why the private ctor takes a MsgStorage object
>to copy since the MsgStorage in this case will be the default
>constructed base subobject created in the initializer list of the
>throwing ctor. As written, the second argument to that ctor is
>useless; the private ctor could default construct its MsgStorage
>subobject.

>Actually, though, I had this in mind:

>template <typename ES, typename MS>
>class error_check : public ES, public MS
>{
> error_check(typename ES::error_type e, std::nothrow_t)
> : ES(e)
> {
> }
>
>public:
> error_check(typename ES::error_type e)
> : ES(e)
> {
> if (failed())
> {
> throw error_check<ES,MS>(e, nothrow);
> }
> }
>};

What about when you use boost::policy::errormsg_storage instead of
boost::policy::no_errormsg_storage? Doing this allows the following:

   typedef boost::errorcheck< boost::policy::error_storage<>,
boost::policy::errormsg_storage >
      errorcheckmsg;

   try
   {
      errorcheckmsg em;
      em( "oops!" ) = -3; // note the special syntax
   }
   catch( errorcheckmsg em )
   {
      std::cout << "error: " << em.get_msg() << '\n';
   }

resulting in "error: oops!" being outputted. Using your method, the message
string will ont be passed and thus you would get "error: unspecified error"!
That is why I implemented it as above.

>(Note that you used "Storage" where you should have used
>"ErrorStorage" in the excerpt above. I just used abbreviations.)

That was my bad: ErrorStorage and Storage are the same.

Regards,
Reece

_________________________________________________________________
Express yourself with cool emoticons - download MSN Messenger today!
http://www.msn.co.uk/messenger


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