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