On Mon, 08 Aug 2011 16:50:48 -0400, Philippe Sigaud <[email protected]> wrote:

On Mon, Aug 8, 2011 at 21:55, Steven Schveighoffer <[email protected]> wrote:

You still can do it, but you have to do it by still using compile-time
constants as indexes:

auto x = 1;
Tuple!(int, short) a;

a[0] = 1;
switch(x)
{
case 0:
  a[0] = 2;
  break;
case 1:
  a[1] = 2;
  break;
default:
  assert(0, "does not compute!");
}

Christian, I think Steven even suggested in an article some months ago
that this big switch could be generated at compile time.
Steven, do you have a link somewhere?

Sorry, wasn't me...


I mean, the tuple length is known as C-T. It's easy to loop on it and
build a string of cases. If you wrap it in a function, it becomes a
runtime switcher.

Proof of concept:

import std.typecons;

string generateSwitches(T...)()
{
    string result = "switch(x) {\n";
    foreach(i,Type; T)
    {
        result ~= "case " ~ to!string(i) ~ ":\n"
                ~ "fun(tup[" ~ to!string(i) ~ "]);\n"
                ~ "break;\n";
    }
    return result ~ "default:\n"
                  ~ "assert(0, q{Bad index: } ~ to!string(x));\n}";
}

void actOnTuple(alias fun, T...)(int x, ref Tuple!T tup)
{
    mixin(generateSwitches!(T));
}

void foo(T)(ref T t) { writeln(t); t = T.init;}

void main()
{
    auto tup = tuple(1, 3.14, "abc");
    auto x = 1;
    actOnTuple!foo(x, tup);
    writeln(tup);
}


I like this idea.  I think it belongs in phobos somewhere, if not already.

-Steve

Reply via email to