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