template type check syntax

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Sun Nov 22 03:54:43 PST 2009


Gzp wrote:
>>
>> void foo(T)(ref T t) if (isPrime!(T)) { ... }
>> void foo(T)(ref T t) if (!isPrime!(T)) { ... }
>>
> 
> What is the difference b/n
> void foo(T)(ref T t) if (isPrime!(T)) { ... }
> and
> void foo(T)(ref T t) static if (isPrime!(T)) { ... }
> as both of them seems to be a compile time check for me.

I'd say that the main difference is that the last one doesn't compile. 
:) It's simply not valid D code.

The if clause in a template declaration is used for template parameter 
matching (like in Bill's examples), whereas static if is a statement 
that is used for conditional compilation. However, you can achieve more 
or less the same thing with them both, but in slightly different ways.

     // This function template is instantiated when T is int.
     void foo(T)(T t)  if (is(T == int)) { ... }

     // This function template is instantiated for all other types
     void foo(T)(T t)  if (!is(T == int)) { ... }

With static if you'd do it like this:

     void foo(T)(T t)
     {
         static if (is(T == int))
         {
             // This code is compiled when T is int.
             ...
         }
         else
         {
             // This code is compiled for all other types.
             ...
         }
     }

Be aware that if you are chaining several static ifs, you have to type 
"static" for each one:

     static if (foo) { ... }
     else static if (bar) { ... }
     else static if (baz) { ... }
     else { ... }

-Lars


More information about the Digitalmars-d-learn mailing list