On Wednesday, 12 December 2012 at 12:34:34 UTC, bearophile wrote:
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

It's a pity it doesn't see T[] as the best fit and go with it on that basis.

Reply via email to