On 10/01/2015 03:26 PM, 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?

Very quickly:

import std.traits;

template allSame(V...)
    if (isExpressions!(V))
{
    bool impl_(V...)() {
        static if (V.length > 1) {
            foreach (i, _; V[0 .. $ - 1]) {
                if (V[i] != V[i + 1]) {
                    return false;
                }
            }

            return true;

        } else {
            return true;
        }
    }

    enum allSame = impl_!V();
}

unittest
{
    static assert( allSame!());
    static assert( allSame!(42));
    static assert( allSame!(42, 42, 42));
    static assert(!allSame!(42, 43, 42));
}

Ali

Reply via email to