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.