template specialization for arrays

Gor Gyolchanyan gor.f.gyolchanyan at gmail.com
Sat Oct 29 12:40:52 PDT 2011


Try this:

void abc(Type)(Type param1)
    if(is(Type = Elem[], Elem))
{
    writeln("array : ", parm1);
}

You can write just about any kind of complex "is" expressions there,
including templates with partially specialized parameters and arrays
of all sorts.

On Sat, Oct 29, 2011 at 8:11 PM, J Arrizza <cppgent0 at gmail.com> wrote:
> Thanks for the reply Jonathan, but it didn't work for me:
>
> void abc(T) (T[] parm1)
> if (isDynamicArray!T)
> {
>   writeln("array : ", parm1);
> }
>
> Nor did:
>
> void abc(T) (T[] parm1)
> if (isStaticArray!T)
> {
>   writeln("array : ", parm1);
> }
>
> Output is the same:
>
> simpleparm: 1
> simpleparm: str
> simpleparm: [1, 2]
>
>
> John
> On Sat, Oct 29, 2011 at 8:41 AM, Jonathan M Davis <jmdavisProg at gmx.com>
> wrote:
>>
>> On Saturday, October 29, 2011 08:24:29 J Arrizza wrote:
>> > I have a template that I'd like to have a specialization for arrays.
>> > Initiall I need it to work for byte arrays, but I'd like to make it
>> > eventually work for all arrays. The page
>> > http://d-programming-language.org/template says to use
>> >
>> > template TFoo(T : T[]) { ... } // #2
>> >
>> >
>> > but when I try it, it doesn't quite work:
>> >
>> > template abc(T)
>> >   {
>> >     void abc(T parm1)
>> >       {
>> >         writeln("simpleparm: ", parm1);
>> >       }
>> >   }
>> >
>> > template abc(T: T[])
>> >   {
>> >     void abc(T parm1)
>> >       {
>> >         writeln("array : ", parm1);
>> >       }
>> >   }
>> >
>> >
>> > void main(string[] args)
>> >   {
>> >     abc(1);
>> >     abc("str");
>> >     int[] arr = [1, 2];
>> >     abc(arr);
>> >   }
>> >
>> >
>> > The output is:
>> >
>> > simpleparm: 1
>> > simpleparm: str
>> > simpleparm: [1, 2]
>> >
>> >
>> > Which is not what I want, it needs to be the specialized  template for
>> > arrays. Note, this doesn't work either:
>> >
>> > template abc(T: T[])
>> >   {
>> >     void abc(T[] parm1)
>> >       {
>> >         writeln("array : ", parm1);
>> >       }
>> >   }
>>
>> Use std.traits.isDynamicArray in a template constraint. eg.
>>
>> void abc(T)(T parm1)
>>    if(isDynamicArray!T)
>> {
>> }
>>
>> - Jonathan M Davis
>
>
>
> --
> John
> blog: http://arrizza.blogspot.com/
> web: http://www.arrizza.com/
>


More information about the Digitalmars-d mailing list