template specialization for arrays

Timon Gehr timon.gehr at gmx.ch
Sat Oct 29 14:32:04 PDT 2011


On 10/29/2011 05:24 PM, J Arrizza wrote:
> I have a template that I'd like to have a specialization for arrays.
> Initiall I need it to work for byte arrays, but I'd like to make it
> eventually work for all arrays. The page
> http://d-programming-language.org/template says to use
>
>     template TFoo(T : T[]) { ... } // #2
>
>
> but when I try it, it doesn't quite work:
>
>     template abc(T)
>        {
>          void abc(T parm1)
>            {
>              writeln("simpleparm: ", parm1);
>            }
>        }
>
>     template abc(T: T[])
>        {
>          void abc(T parm1)
>            {
>              writeln("array : ", parm1);
>            }
>        }
>
>
>     void main(string[] args)
>        {
>          abc(1);
>          abc("str");
>          int[] arr = [1, 2];
>          abc(arr);
>        }
>
>
> The output is:
>
>     simpleparm: 1
>     simpleparm: str
>     simpleparm: [1, 2]
>
>
> Which is not what I want, it needs to be the specialized  template for
> arrays. Note, this doesn't work either:
>
>     template abc(T: T[])
>        {
>          void abc(T[] parm1)
>            {
>              writeln("array : ", parm1);
>            }
>        }
>
>
> John

Fixed:

template abc(T) {
     void abc(T parm1) {
         writeln("simpleparm: ", parm1);
     }
}

void abc(T:T[])(T[] parm1) {
     writeln("array : ", parm1);
}


void main(string[] args) {
     abc(1);
     abc!(typeof("str"))("str");
     int[] arr = [1, 2];
     abc!(int[])(arr);
}


The important thing to note is that when pattern matching on T[] is 
done, then T is the element type of the array, not the array type.




More information about the Digitalmars-d mailing list