On Friday, 6 September 2013 at 13:50:25 UTC, ilya-stromberg wrote:
On Friday, 6 September 2013 at 13:30:26 UTC, Dicebot wrote:
So, what essentially is needed, is ability to implicitly convert literals of built-in types to user types, not any possible implicit conversion?

I think allowing it with such restrictions can be reasonably clean.

Yes, the ability to implicitly convert literals of built-in types to user types is REALLY needed.
The 2-nd error from "factorial" example

import std.bigint;

void main()
{
assert(factorial!BigInt(BigInt(3)) == 6); //Error: incompatible types for ((1) : (number.opBinary(factorial(number.opBinary(1))))): 'int' and 'BigInt'
}


The correct factorial implementation is:

T factorial(T)(T number)
{
   enum T one = 1;
return number <= one ? one : number * factorial!T(number - one);
}

Or just:

//----
import std.bigint;

T factorial(T)(T number)
{
    return number <= 1 ?
        T(1) :
        number * factorial!T(number - 1);
}
//----

The problem though is that this requires "uniform construction", which we don't have yet:
http://d.puremagic.com/issues/show_bug.cgi?id=9112

Reply via email to