On 05/31/2014 02:11 PM, Paul D Anderson wrote:
I'm working on the decimal number package for D. A decimal is a struct
with precision, max exponent and rounding mode parameters:
"Decimal!(PRECISION, MAX_EXPO, ROUNDING)". I was trying to overload the
opCast operator for this struct and I found that it does not seem
necessary. I can cast decimals with different precisions, etc., back and
forth without overloading opCast.

This code works:

alias dec9  = Decimal!(9,99);
alias dec10 = Decimal!(10,99);

dec9 bingo = dec9("123.45");
dec10 little = cast(dec10(bingo));

You meant cast(dec10)(bingo).

assert(little == dec10("123.45"));

Is this expected behavior?

Paul


That is surprising. I've discovered that if the template has members that depend on a template parameter than the code fails to compile. I think it should fail to compile in other cases as well because a separate instantiation of a template is a separate type potentially with completely different invariants.

Here is reduced code that fails to compile:

struct Decimal(int A, int B)
{
    int[A] arrA;// Replace this with something that does not depend on a
                // template parameter and the code compiles.

    this(string)
    {}
}

alias dec9  = Decimal!(9,99);
alias dec10 = Decimal!(10,99);

void main()
{
    dec9 bingo = dec9("123.45");
    dec10 little = cast(dec10)(bingo);

    assert(little == dec10("123.45"));
}

Ali

Reply via email to