Boost logo

Boost :

From: Rob Stewart (stewart_at_[hidden])
Date: 2004-03-30 17:36:35


From: "Reece Dunn" <msclrhd_at_[hidden]>
> 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
> >));
> > > }
> > > };
[snip]
> >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.

I didn't see anything like that in the code you showed. It was
probably in the full implementation, but I was only looking at
what's quoted above.

Anyway, why must either constructor manage the string at this
point? Why wouldn't the generation of the string occur at the
time it is requested? That is, there is no string to copy if
there is no string generated until the get_msg() mf is called.
That mf can create the string (reusing it if already computed, of
course).

If you find your approach is still needed, no problem. I just
wanted to be sure you understood what I had implied.

-- 
Rob Stewart                           stewart_at_[hidden]
Software Engineer                     http://www.sig.com
Susquehanna International Group, LLP  using std::disclaimer;

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