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