� wrote:
Dnia 31-01-2010 o 20:59:47 Tomek Sowi�ski <[email protected]> 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.

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

Reply via email to