Jack Applegame:

On Tuesday, 3 March 2015 at 17:49:24 UTC, bearophile wrote:
That's 1 + n-1 :-)
Could you please explain what does '1 + n-1' mean?

This is your code:

template Is(ARGS...) if(ARGS.length % 2 == 0) {
   enum N = ARGS.length/2;
   static if(N == 1) enum Is = is(ARGS[0] : ARGS[1]);
else enum Is = is(ARGS[0] : ARGS[N]) && Is!(ARGS[1..N], ARGS[N+1..$]);
}

The recursion scheme you are using is working on a single item (a single pair of items), and then calling the recursion on all other items but the first.

If you look in std.traits you see examples of a different recursion that reduces compilation time:

template isExpressionTuple(T ...)
{
    static if (T.length >= 2)
        enum bool isExpressionTuple =
            isExpressionTuple!(T[0 .. $/2]) &&
            isExpressionTuple!(T[$/2 .. $]);
    else static if (T.length == 1)
        enum bool isExpressionTuple =
            !is(T[0]) && __traits(compiles, { auto ex = T[0]; });
    else
        enum bool isExpressionTuple = true; // default
}


Bye,
bearophile

Reply via email to