Subject: Re: [boost] [review] string convert
From: Barend Gehrels (barend_at_[hidden])
Date: 2011-05-04 09:46:46


Hi Gordon,
> So, here's something complete (?) for people to rip apart:
>
> int i = convert_cast<int>(s); // default behavior: might throw
> optional<int> i = convert_cast<int>(s, use_optional_instead_of_throwing_);
> int i = convert_cast<int>(s, 17); // won't throw; can't tell if conversion successful
> int i = convert_cast<int>(s, 17, throw_even_though_i_specified_a_failback_);
> optional<int> i = convert_cast<int>(s, 17, use_optional_instead_of_throwing_);
> pair<bool,int> i = convert_cast<int>(s, 17, fallback_and_report_success_);
>
> I am not concerned with names, just with syntax. So I'm using "convert_cast" although I actually don't care what it's called, and I have some very ugly very descriptive tag values with distinct types to trigger different overloads, which might be abbreviated dont_throw_, do_throw_, and, um, tell_fallback_ or something.
>
> All would also accept extra manip_/format_= and locale_ arguments as in Vladimir's proposal, except they have to be appended to the first parameter list because of the "no proxies" requirement.
>
> Doesn't this now cover all the functionality we've been talking about?
>
>
> Since there are now a bunch of overloads with different behavior, and no converter<> object, I figure these would dispatch to a customization point function that looks a lot like Vicente's, but probably with a default an extra bool parameter indicating whether to throw.

Sounds good.

What about:

int i = convert_cast<int>(s); // agreed
optional<int> i = convert_cast<optional<int> >(s); // so optional
indicated in template parameter as return type - as always
int i = convert_cast<int>(s, 17); // agreed
int i = convert_cast<int, throw_even_though_i_specified_a_failback_>(s,
17); // template parameter as optional one there
optional<int> i ... (similar as other one with optional)
pair<bool, int> i = convert_cast<pair<bool, int> >(s, 17); // pair
indicated in template parameter

This would never need any runtime parameter -> dispatching possible on
compile-time -> no if's or cases necessary in implementation.
And it always returns the type is in the (first) template parameter of
convert.

Regards, Barend