Tuple [] operator

Steven Schveighoffer schveiguy at yahoo.com
Mon Aug 8 14:15:36 PDT 2011


On Mon, 08 Aug 2011 16:50:48 -0400, Philippe Sigaud  
<philippe.sigaud at gmail.com> wrote:

> On Mon, Aug 8, 2011 at 21:55, Steven Schveighoffer <schveiguy at yahoo.com>  
> 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


More information about the Digitalmars-d-learn mailing list