Make a type tuple from an array

John Colvin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Apr 10 08:36:40 PDT 2015


On Friday, 10 April 2015 at 15:13:54 UTC, Marc Schütz wrote:
> Is there a way to turn an array (known at compile time) into a 
> TypeTuple? I want to do a static foreach over it, like this:
>
>     foreach(field; fields) {
>         static if(is(mixin("T." ~ field.name))) { ... }
>     }
>
> Obviously that won't work, because we don't have a real static 
> foreach yet.
>
> I already worked around it with a string mixin, but I'd like to 
> know whether there's a cleaner way...

For input ranges in general:

import std.range : isInputRange;

template TypeTupleOf(TL...)
     if (TL.length == 1 && isInputRange!(typeof(TL[0])))
{
     import std.typetuple : TT = TypeTuple;
     enum r = TL[0];
     static if (r.empty)
         alias TypeTupleOf = TT!();
     else
     {
         enum f = r.front;
         alias TypeTupleOf = TT!(
             f,
             TypeTupleOf!(
                 { auto tmp = r; tmp.popFront(); return tmp; }()
                 )
             );
     }
}

unittest
{
     import std.range : iota;
     foreach(i; TypeTupleOf!(iota(10)))
     {
         pragma(msg, i);
     }
}


More information about the Digitalmars-d-learn mailing list