How to expand an expression along with a parameter tuple?

TommiT tommitissari at hotmail.com
Sun Jun 16 23:19:45 PDT 2013


I can't figure out how to do the following C++ code in D:

int arr[] = { 1, 3, 5, 7, 11 };

template <typename... T>
void foo(T... values) { }

template <typename... T>
void bar(T... values)
{
     foo((arr[values] * 10)...);
}

int main()
{
     bar(1, 3, 4); /* calls foo(arr[1] * 10,
                                arr[3] * 10,
                                arr[4] * 10); */
     return 0;
}


This is how I tried to do it in D, but it doesn't work:

import std.conv;
import std.typetuple;

int[5] arr = [ 1, 3, 5, 7, 11 ];

void foo(T...)(T values) { }

void bar(T...)(T values)
{
     foo(expandWrapped!("arr[@] * 10", values));
}

template expandWrapped(string fmt, X...)
{
     string compose()
     {
         string ret = "alias expandWrapped = TypeTuple!(";

         foreach (i; 0 .. X.length)
         {
             auto iStr = to!string(i);

             foreach (ch; fmt)
             {
                 if (ch == '@')
                 {
                     ret ~= "X[" ~ iStr ~ "]";
                 }
                 else
                 {
                     ret ~= ch;
                 }
             }

             if (i != X.length - 1)
             {
                 ret ~= ",";
             }
         }
         ret ~= ");";
         return ret;
     }
     mixin(compose()); // [1]
}

void main()
{
     bar(1, 3, 4);
}

1) Error: variable arr cannot be read at compile time


More information about the Digitalmars-d-learn mailing list