On Wednesday, 21 October 2020 at 22:50:27 UTC, matheus wrote:
Hi,

import std.stdio, std.conv;
void main(string[ ] args) {
    auto a = (1).to!int;     // this works
    auto b = ("1").to!int;   // this works
    auto c = (1.1).to!int;   // this works and c = 1
    auto d = ("1.1").to!int; // Doesn't work
}

The forth line gives me:

std.conv.ConvException@/usr/include/dlang/dmd/std/conv.d(1898): Unexpected '.' when converting from type string to type int
----------------
??:? pure @safe int std.conv.toImpl!(int, immutable(char)[]).toImpl(immutable(char)[]) [0x55de76d9b4d7] ??:? pure @safe int std.conv.to!(int).to!(immutable(char)[]).to(immutable(char)[]) [0x55de76d99a17]
??:? _Dmain [0x55de76d9986e]

Question:

Since (1.1).to!int = 1, shouldn't the string value ("1.1").to!int at least try to convert to float/double and then to int?

Because for what I see "to!int" converts from: int,real but in case of string only when it is a integer representation?

Matheus.

In first case you asked to convert a float (inferred by templace function) to int in the second case, you asked for the function "convert this string contaning a set of digits to an int for me". Doesn't make sense do something else than the asked. D has static if() and a nice way to do type comparasion at compile time. It does optimize things alot.

I haven't read the to source code, but consider it may use the idea like this:

auto to(T, T2)(T2 source)
{
// you asked for int, doesn't makes sense consider a float here. // that would waste time checking for floats when you programmer's requested
    // was clear: an integer.
    static if(is(T == int) && is(T2 == string))
    {
        int v = 0;
        foreach(c; source)
            v = v * 10 + c - '0';
        return v;
    }
    // the string to float point conversion algorithm
    static if(is(T == float) && is(T2 == string))
    {
        /* ... */
    }
    static if(is(T == int) && is(T2 == double))
    {
        return cast(int)source;
    }
    assert(0, "unknow type");
}

Reply via email to