Am 21.07.2014 17:04, schrieb TheFlyingFiddle:
On Monday, 21 July 2014 at 01:42:58 UTC, Daniel Gibson wrote:
Am 21.07.2014 03:34, schrieb Vlad Levenfeld:
To get a foreach to run at compile-time, you have to give it something
whose value is known to the compiler (so, T and typeof(argTuple) would
suffice, and 0..T.length really should as well).

Yup

I use this when i want a compile time foreach(from a constant number).
It's slightly longer but has worked great for me thus far.

template staticIota(size_t s, size_t e, size_t step = 1)
{
     import std.typetuple : TypeTuple;
     static if(s < e)
     alias staticIota = TypeTuple!(s, staticIota!(s + step, e));
     else
     alias staticIota = TypeTuple!();
}

Yeah, I had a similar workaround:

template TupleIndicesImpl(alias len, I...)
{
  static if(len == I.length) // also handles len == 0
    alias TupleIndicesImpl = I;
  else static if(I.length == 0)
    alias TupleIndicesImpl = TupleIndicesImpl!(len, 0);
  else // I contains 0 ... I.length - 1, so add I.length
    alias TupleIndicesImpl = TupleIndicesImpl!(len, I, I.length);
}

template TupleIndices(alias len)
{
  alias TupleIndices = TupleIndicesImpl!(len);
}

foreach(i; TupleIndices!(myTuple.length) { ... }

At least for iterating over a tuple Vlad's way suggestion
("foreach(i, U; TupleType)") is nicer and more concise.

However, having something like staticIota in the stdlib would probably make sense.

Cheers,
Daniel

Reply via email to