bearophile wrote:
So with your current changes to BigInt, in the following program to
replace the int "i" with a BigInt:
void main() {
int i = 1;
if (i)
i++;
auto a = [10, 20, 30, 40];
printf("%d\n", a[i]);
}
you need to change the code like this:
void main() {
BigInt i = 1;
if (i != 0)
i++;
auto a = [10, 20, 30, 40];
printf("%d\n", to!(long)a[i]);
}
The toBool will help avoid the change in the second line.
I'd like to change programs as little as possible when I change the
type of a variable from int to BigInt. This has also the big
advantage that I can write templated algorithms that work with both
ints and BigInts with as few "static if" as possible (to manage
BigInts in a special way, for example adding that to!(long) ). That's
why in such situation an implicit casting is handy.
why not just use (i != 0) in both cases? this should work with any
numeric type (so it'll be used in generic code).
conversion of ints to bools in C is IMO a hole in the type system due to
the lack of a boolean type in C. All those narrowing implicit casts
inherited from C are a bad idea IMO.
the need to convert the bigInt to long in order to print it is a design
error in printf() - the format string should specify the formatting of
the variables not their types.