using a typedefed variable with library classes
Sergey Gromov
snake.scaly at gmail.com
Mon Jan 12 08:48:04 PST 2009
Sun, 11 Jan 2009 18:09:15 -0800, Charles Hixson wrote:
> Well, my use case just involves being able to use library function with
> the proper base type. (I.e., int instead of long or byte when I do
> typedef int LocalType;
> LocalType t;
> File f;
> f.write(t);
>
> I'll grant that I *can* use alias for such a purpose, but that doesn't
> distinguish between LocalType and ArrayIndex in routines defined for
> those types. E.g.:
> typedef int ArrayIndex;
> void zeroIndex(out ArrayIndex ai) { ai = 0; }
> zeroIndex(t);
>
> Should throw an error. If I'm using alias it doesn't (and shouldn't);
Well, I presume File.write() has many overloads, including one for int
but none for LocalType. When aliasing, the LocalType *is* an int, it
matches exactly File.write(int) and the compiler is happy.
However, with a typedef, LocalType is a distinct type. Yes it casts to
int implicitly, but likewise it casts implicitly to char, short and
long. So compiler gets a whole load of File.write() functions matching
with conversions, and fails because of the ambiguity.
That's how the language works, and it's pretty consistent IMO. What you
can do is:
f.write(cast(int)t);
or use templates to generalize:
auto fileWrite(T : LocalType)(File f, T v)
{
return f.write(cast(int)v);
}
auto fileWrite(T)(File f, T v)
{
return f.write(v);
}
fileWrite(f, t); // OK
fileWrite(f, 15); // OK
When we get generic function calls you'd be even able to write:
void write(File f, LocalType l)
{
f.write(cast(int)l);
}
f.write(t); // OK, write(f, t) is called
More information about the Digitalmars-d-learn
mailing list