Default-valued nothrow @nogc std.conv:to

crimaniak via Digitalmars-d digitalmars-d at puremagic.com
Sun Apr 23 20:05:34 PDT 2017


On Saturday, 22 April 2017 at 12:14:26 UTC, Nordlöw wrote:
> Have anyone tried to implement a variant of `std.conv.to` that 
> can be `nothrow @nogc` if the exception handling is replaced by 
> an extra second parameter (`defaultValue`) returned iff the 
> call to `to` throws?

There is common ifThrown template in Phobos: 
https://dlang.org/phobos/std_exception.html#ifThrown
I think it's better to add nothrow ifThrown implementation if 
needed.

As for me, for such cases, where input data can be not relevant, 
is better to use Nullable type to indicate the error. In this 
case, an input value equal to the default value does not cause 
problems. Something like this:

import std.typecons: Nullable;

Nullable!T nullableTo(T, S)(S source)
{
     import std.conv : to;
     try                return Nullable!T(source.to!T);
     catch(Exception e) return Nullable!T();
}

T orElse(T)(Nullable!T n, T value){ return n.isNull() ? value : 
n.get; }

unittest
{
     assert(! "0".nullableTo!int.isNull);
     assert("0.0".nullableTo!int.isNull);

     assert("123.45".nullableTo!int.isNull);
     assert("123".nullableTo!int.get == 123);

     // And easy convertable to default value variant
     assert("123.45".nullableTo!int.orElse(5) == 5);
}


More information about the Digitalmars-d mailing list