I'm trying to create a function that repeats a function call N times. The exact use case is generating an N-dimensional tuple:

import std.typetuple;
import std.typecons;

template Repeat(size_t n, T...) {
    static if (n == 1) {
        alias Repeat = T;
    } else static if (n) {
        alias Repeat = TypeTuple!(Repeat!(n /2, T), Repeat!((n +1)/2, T));
    } else {
        alias Repeat = TypeTuple!();
    }
}

auto fun1(size_t dim, T)(lazy T fn) {
    return tuple(Repeat!(dim, fn));
}

auto fun2(size_t dim, alias fn)() {
    return tuple(Repeat!(dim, fn));
}

void main() {
    int a = 0;
    assert(fun1!3(a++) == tuple(0,1,2));
//    assert(fun2!(3, ()=>a++) == tuple(0,1,2));
}

Now, the call to fun1 works great. But I'd like to specify fn at compile-time, thus doing something more like fun2. fun2 of course, does not work (else why would I ask?).

I tried staticMap'ing a template that calls its parameter over the result of Repeat in Fun2, but that did not work:

template call(alias fn) {
    alias call = TypeTuple!(fn());
}

auto fun3(size_t dim, alias fn)() {
    return tuple(staticMap!(call, Repeat!(dim, fn)));
}

fun3 ends up trying to evaluate the function call at compile-time, and fails because a++ can't be executed until run-time.

Better ideas, please?

--
  Simen

Reply via email to