Boost logo

Boost :

Subject: Re: [boost] [review] string convert
From: Stewart, Robert (Robert.Stewart_at_[hidden])
Date: 2011-05-03 11:36:12

Jeff Flinn wrote:
> Stewart, Robert wrote:
> > Gordon Woodhull wrote:

[snip massively overquoted context]

> >>> convert<int>::result res = convert<int>::from("blah", -1);
> >>> if (!res) message("conversion failed");
> >>> int value = res.value(); // proceed with the fallback
> >>> anyway.
> >
> >> It's just that the next line might read
> >>
> >> int res2 = convert<int>::from("blah");
> >>
> >> and throw, and there's no indication why one version throws
> >> and the other does not.
> >
> > Of course there is. One was given a fallback value and the
> > other wasn't.
> dynamic_cast sets a precedent for how to handle throwing/non-
> throw variations:
> dynamic_cast<X&>(y); // throws if cast fails
> X* x = dynamic_cast<X*>(y); // returns 0
> So if boost::optional is the analog of pointer, and we go to
> some xxx_cast naming convention we could have:
> // throws if fails
> int i = xxx_cast<int>(s);
> // returns empty optional if cast fails
> boost::optional<int> oi = xxx_cast<boost::optional<int>>(s);
> // never fails
> int i = xxx_cast<int>(s, 123);
> This just reuses boost::optional rather than the (superfluous
> to me) convert<T>::result type. I for one see no reason that
> _cast need be limited to a single argument.

I really dislike the repetition of "boost::optional<int>" in that. What about going a little farther in the dynamic_cast direction (actually, following the boost::get precedent):

   int const i(xxx_cast<int>(s)); // throws on failure
   boost::optional<int> const oi(xxx_cast<int>(&s));

Whereas dynamic_cast requires casting from a pointer type to a pointer type, here the suggestion is that casting from a pointer type implies casting to an optional. Note that the cast is "xxx_cast<int>" in both cases; it’s the source argument's being a pointer or not that dictates the overload and, thus, the return type.

> If others find multiple arguments too disgusting, perhaps
> boost::make<int>(s, 123) is more palatable.

That name could work, but does it allow for formatting? IOW, "convert," like "translate," leaves room to consider formatting, including locales. "Make" suggests something more fixed to me.

Rob Stewart robert.stewart_at_[hidden]
Software Engineer using std::disclaimer;
Dev Tools & Components
Susquehanna International Group, LLP

IMPORTANT: The information contained in this email and/or its attachments is confidential. If you are not the intended recipient, please notify the sender immediately by reply and immediately delete this message and all its attachments. Any review, use, reproduction, disclosure or dissemination of this message or any attachment by an unintended recipient is strictly prohibited. Neither this message nor any attachment is intended as or should be construed as an offer, solicitation or recommendation to buy or sell any security or other financial instrument. Neither the sender, his or her employer nor any of their respective affiliates makes any warranties as to the completeness or accuracy of any of the information contained herein or that this message or any of its attachments is free of viruses.

Boost list run by bdawes at, gregod at, cpdaniel at, john at