|
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