Templates array detection
ixid
nuaccount at gmail.com
Wed Dec 12 06:09:15 PST 2012
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.
More information about the Digitalmars-d-learn
mailing list