daoryn Wrote:

> According to http://digitalmars.com/d/2.0/template.html it is possible to 
> specify template specialization so that DMD prefers them when instanciating 
> templates, however the following code:
> 
> 
> ---------------------------------
> import std.stdio;
> 
> void print(T)(T thing)
> {
>       writeln("Calling print(T)");
>       writeln(T.stringof);
> }
> 
> void print(T:T[])(T[] things)
> {
>       writeln("Calling print(T[])");
>       writeln(T.stringof);
> }
> 
> void main()
> {
>       print(3);
>       print([1,2,3]);
> }
> 
> -----------------------------------------
> 
> will output:
> 
> Calling print(T)
> int
> Calling print(T)
> int[3u]
> 
> I expected it to output "calling print(T[])" on the second "print". Would 
> this be a bug or did I misunderstand the template specialization?
> 

It looks like the type of the array literal is a static array, not a dynamic 
one.
Static arrays can be matched with the following specification:
void print(T : U[N], U, size_t N)(T things)
Or you could use the slice operator to transform the static array into a 
dynamic one.
eg print([1,2,3][]);

Reply via email to