template specialization question

Tomek Sowiński just at ask.me
Sun Jan 31 12:46:02 PST 2010


Dnia 31-01-2010 o 21:39:21 Ali Çehreli <acehreli at yahoo.com> napisał(a):

> � wrote:
>> Dnia 31-01-2010 o 20:59:47 Tomek Sowi�ski <just at 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


More information about the Digitalmars-d-learn mailing list