template specialization for arrays

Steven Schveighoffer schveiguy at yahoo.com
Mon Oct 31 05:07:12 PDT 2011


On Sun, 30 Oct 2011 10:36:26 -0400, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> On 10/30/11 5:16 AM, J Arrizza wrote:
>>         You should use either std.traits.isXxx systematically, or
>>         patterns systematically, but not both at the same time.
>>         Personally I prefer isXxx because they foster simple logic to
>>         decide what overloads should apply.
>>
>>
>>     Also, when posting, you may want to include complete short programs
>>     so others can try them quickly.
>>
>>
>> Andrei, I thought I had posted the entire program. Here it is again
>> using only traits as you recommend:
>>
>>     import std.stdio;
>>     import std.traits;
>>     void abc(T) (T parm1)
>>        if (isNarrowString!T || (!isStaticArray!T && !isDynamicArray!T))
>>        {
>>        writeln("simpleparm: ", parm1);
>>        }
>>     void abc(T) (T parm1)
>>        if (!isNarrowString!T && (isDynamicArray!T || isStaticArray!T) )
>>        {
>>        writeln("array : ", parm1);
>>        }
>>     void main(string[] args)
>>        {
>>          writeln("v4");
>>          abc(1);
>>          abc("str");
>>          int[] arr = [1, 2];
>>          abc(arr);
>>          int[2] arr2 = [3, 4];
>>          abc(arr2);
>>        }
>
> Thanks, sorry for having missed that.
>
> The code as above is canonical. I think restricted templates are the way  
> to go for most code. Pattern matching on types is rather arcane and  
> should be let to a few advanced uses (such as implementing traits  
> themselves).

The attraction of using specializations instead of constraints (aside from  
the readability) is that specializations do not require modifying the  
non-specialized templates.

For example:

void abc(T)(T parm1) {...}
void abc(T:int)(T parm1) {...}

vs:

void abc(T)(T parm1) if (!is(T : int)) {...}
void abc(T)(T parm1) if (is(T: int)) {...}

Note that the if(!is(T :int)) is required in the base case.  This can  
quickly get out of hand if you have lots of specializations (see any  
phobos modules for lots of examples).  It might be nice if constrained  
templates took precedence over non-constrained ones.

-Steve


More information about the Digitalmars-d mailing list