Boost logo

Boost :

Subject: Re: [boost] [convert] no-throw and fallback feature
From: Vicente BOTET (vicente.botet_at_[hidden])
Date: 2011-05-10 15:55:06


> Message du 10/05/11 20:39
> De : "Stewart, Robert"
> A : "'boost_at_[hidden]'"
> Copie à :
> Objet : Re: [boost] [convert] no-throw and fallback feature
>
> Vicente BOTET wrote:
> >
> > > For general use with optional, I think the opt_tie() overload
> > > might be useful.
> > >
> > Sorry Robert. You lost me.
>
> I'm sorry. I'll try again.
>
> > Are you using the word overload instead of conversion?
>
> No.
>
> Compare the following options:
>
> // ------------------------
> // 1
> int i(fallback);
> optional const o(convert_to>(s));
> if (o)
> {
> i = *o;
> }
> else
> {
> std::cerr << "using fallback\n";
> }
>
> // ------------------------
> // 2
> int i(fallback);
> bool b;
> opt_tie(i, b) = convert_to>(s);
> if (!b)
> {
> std::cerr << "using fallback\n";
> }
>
> // ------------------------
> // 3 (Vladimir dislikes this one)
> int i(fallback);
> if (!try_convert_to(s, i))
> {
> std::cerr << "using fallback\n";
> }
>
> Notice that, for those who dislike try_convert_to(), #2 is nicer than #1.
>
> Of course, if reporting the use of the fallback isn't needed, and the fallback isn't expensive to compute, there are these options:
>
> // ------------------------
> // A
> int i(fallback);
> opt_tie(i) = convert_to>(s);
>
> // ------------------------
> // B
> int const i(convert_to>(s).get_value_or(fallback));
>
> // ------------------------
> // C
> int i(fallback);
> try_convert_to(s, i);
>
> For those who dislike try_convert_to(), A is a more convenient option than B.
>
> Both overloads of opt_tie() are useful. Both assign to their first argument, if the optional is set. The one with the extra argument also sets the optional's state in that argument. That's easy enough to explain and use.

If opt_tie is implicitly convertible to a bool as it is optional

> // 2
> int i(fallback);
> bool b;
> opt_tie(i, b) = convert_to>(s);
> if (!b)
> {
> std::cerr << "using fallback\n";
> }

can be written as

// 2 b
int i(fallback);
if (!( opt_tie(i) = convert_to>(s)) )
{
std::cerr << "using fallback\n";
}

I agree however that //2 could be easier to read. Do you think that opt_tie must be implicitly convertible to bool or not?

Best,
Vicente


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