Dnia 31-01-2010 o 21:39:21 Ali Çehreli <acehr...@yahoo.com> napisał(a):
� wrote:
Dnia 31-01-2010 o 20:59:47 Tomek Sowi�ski <j...@ask.me> napisa�(a):
// specialization needed to limit matching types
void print(T:int)(T thing)
To be clear -- I did this to silence the compiler saying the call with
array matches more than one function template declaration. I'm not sure
whether the compiler is right -- it has a print specifically for arrays
so it should be picked over plain print(T) as it's more specialized...
any template expert here?
Tomek
It works with dmd 2.040 without the :int specialization.
It's high time I upgraded, then.
Also, for variety, i've used the 'is' expression as described here
http://digitalmars.com/d/2.0/expression.html#IsExpression
for "conditional compilation" in the program below. I think
specialization vs. conditional compilation differ semantically this way
(no expert here! :) ):
specialization: Use this definition for T matching U[]
is expression: Consider this definition only for T matching U[]
The effect should be the same in this case; but it feels like there must
be a difference. :)
import std.stdio;
void print(T)(T thing)
{
writeln("Calling print(T)");
writeln(T.stringof);
}
// T is an array of any Us.
void print(T, U)(T things)
if (is (T == U[])) // <-- is expression
{
writeln("Calling print(T[])");
writeln(T.stringof);
}
void main()
{
print(3);
print([1,2,3]);
}
Also it could be is (T : U[]) as well, which differs from is (T == U[])
as explained at the link above.
Ali
Or even simpler:
void print(T)(T[] things)
But that's "regular" not template overloading.
Tomek