Checking that a template parameter is an enum

John Colvin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Oct 2 01:12:58 PDT 2015


On Thursday, 1 October 2015 at 22:26:39 UTC, Nordlöw wrote:
> On Thursday, 1 October 2015 at 02:06:48 UTC, Fusxfaranto wrote:
>>> /** Returns: true iff all values $(D V) are the same. */
>>> template allSame(V...)          // TODO restrict to values 
>>> only
>>> {
>>>     static if (V.length <= 1)
>>>         enum bool allSame = true;
>>>     else
>>>         enum bool allSame = V[0] == V[1] && allSame!(V[1..$]);
>>> }
>>
>> std.traits to the rescue!
>>
>> http://dlang.org/phobos/std_traits.html#isExpressions
>>
>> Using isExpressions!V as a template constraint looks like the 
>> behavior you're looking for.
>
> Thanks!
>
> BTW: Is there some way to turn the recursive definition of 
> `allSame`
>
> template allSame(V...)
>     if (isExpressions!(V))
> {
>     static if (V.length <= 1)
>         enum allSame = true;
>     else
>         enum allSame = V[0] == V[1] && allSame!(V[1..$]);
> }
>
> into an iterative definition?

Why? To avoid slowing down compilation with all those template 
instantiations?

How about a O(log2(N)) depth recursive version, something like 
this:

template allSame(V ...)
     if (isExpressions!V)
{
     static if (V.length <= 1)
         enum allSame = true;
     else static if(V.length & 1)
         enum allSame = V[$-1] == V[0]
             && V[0 .. $/2] == V[$/2 .. $-1]
             && allSame!(V[0 .. $/2]);
     else
         enum allSame = V[0..$/2] == V[$/2 .. $]
             && allSame!(V[0 .. $/2]);
}


More information about the Digitalmars-d-learn mailing list