Templates array detection

bearophile bearophileHUGS at lycos.com
Wed Dec 12 04:34:33 PST 2012


Cube:

> I'm having a problem getting templates to work correctly.
> I want to handle arrays differently, but when I try to compile 
> the following example code it says it matches more than 1 
> template. What is the correct way to do this?
>
>
> --
> void main()
> {
>     foo(1);
>     foo([1,1]);
> }
>
> void foo(T)(T t)
> {
>     writeln(t);
> }
>
> void foo(T)(T[] t)
> {
>     for(int i = 0; i < t.length; i++)
>         writeln(t[i]);
> }
> --

In general D templates refuse ambiguity. So to fix your situation 
you have to state that the T in your first foo overload is not an 
array:

import std.stdio, std.traits;

void main()
{
     foo(1);
     foo([1, 1]);
}

void foo(T)(T t) if (!isArray!T)
{
     writeln(t);
}

void foo(T)(T[] t)
{
     foreach (ti; t)
         writeln(ti);
}


Bye,
bearophile


More information about the Digitalmars-d-learn mailing list