std.mixins

Philippe Sigaud philippe.sigaud at gmail.com
Tue Aug 31 14:37:11 PDT 2010


On Tue, Aug 31, 2010 at 22:41, Lutger <lutger.blijdestijn at gmail.com> wrote:

>
> Wait what, we have static foreach? I thought that didn't work out.
>
>
foreach is automatically done at compile-time if you iterate in typetuples

string toStrings(Args...)(Args args) //btw, I regularly need this
{
  string result;
  foreach(i,Type; Args)
  {
    result ~= args[i] ~ " ";
  }
  return result;
}

In the above example, I iterate in Args, getting all types and their
respective indicex in turn, and use the *compile-time* index i to address
the i-th value in the expression tuple args.



> I want this to work or something like it, is it possible?
>
> enum test = [1,2, 3];
>
> foreach(i; 0..test.length) {
>    pragma(msg, to!string(test[i]) );
> }
>

Well, 0..someEnum is not recognized by the compiler. The workaround is to
create a typetuple of the correct length and use it as a support for
iteration:

template ZeroTo(int to) if (to >= 0)
{
  static if (to == 0)
    alias TypeTuple!() ZeroTo;
  else static if (to == 1)
    alias TypeTuple!(0) ZeroTo;
  else
    alias TypeTuple!(ZeroTo!(to-1), to-1) ZeroTo; // here I use the fact
that integers are accepted directly as template parameters and that
TypeTuple auto-flatten
}

so ZeroTo!3 is (0,1,2), since I made it a range open on the right. ZeroTo!0
is empty...

enum test = [1,2, 3];

foreach(i; ZeroTo!(test.length)) {
   pragma(msg, to!string(test[i]) );
}

The from -> to version is easy, along with a step parameter.


Philippe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20100831/9025623f/attachment.html>


More information about the Digitalmars-d mailing list