Templates array detection
    Ali Çehreli 
    acehreli at yahoo.com
       
    Wed Dec 12 09:05:32 PST 2012
    
    
  
On 12/12/2012 07:37 AM, Cube wrote:
 > On Wednesday, 12 December 2012 at 15:21:16 UTC, Ali Çehreli wrote:
 >> On 12/12/2012 06:49 AM, Cube wrote:
 >> > Better example code for my other problem. How can I make the
 >> 3rd foo
 >> > work on Datas?
 >> >
 >> > --
 >> > struct Data(T)
 >> > {
 >> > T elem;
 >> > }
 >>
 >> Data is a struct template, not a type (until instantiated).
 >>
 >> > void foo(T)(T t) if(is(T == Data)) // ?
 >>
 >> This works:
 >>
 >> void foo(T)(T t) if(is(T == Data!T))
 >
 > It doesn't seem to work for me, it uses the first foo. And I can't see
 > how it would work, actually.
 > If T is a Data!float, then wouldn't
 > is(T == Data!T)
 > be equal to
 > is(Data!float == Data!Data!float)
 > ?
I have to deal with the magical 'is expression' again! :p
First, also notice that you ar not passing Data!T but a pointer to 
Data!T. This program works:
import std.stdio;
import std.traits;
struct Data(T)
{
     T elem;
}
void main()
{
     foo(1);
     foo([1,1]);
     auto tmp1 = new Data!(int);
     tmp1.elem = 3;
     foo(tmp1);
     auto tmp2 = new Data!(string);
     tmp2.elem = "hello";
     foo(tmp2);
}
void foo(T)(T t) if(!isArray!T && !is(T ThisIsNeededButUnusable : 
Data!U*, U))
{
     writeln(t + 1);
}
void foo(T)(T t) if(isArray!T)
{
     for(int i = 0; i < t.length; i++)
         writeln(t[i]);
}
void foo(T)(T t) if (is(T ThisIsNeededButUnusable : Data!U*, U))
{
     writeln("desired");
     // Note that both of the 'if's are replaced with 'static if's.
     // Also, both are 'pointers' in the conditionals.
     static if(is(T == Data!int*))
         writeln(t.elem + 1);
     else static if(is(T == Data!string*))
         writeln(t.elem);
}
I think ThisIsNeededButUnusable above is a compiler bug. It has a use 
when the body of the 'is' is used inside template parameter lists but 
not in a template constraint. It is still needed to satisfy the 
syntax... (?)
Ali
    
    
More information about the Digitalmars-d-learn
mailing list