Any way to expand a tuple?

Lutger Blijdestijn lutger.blijdestijn at gmail.com
Sun Sep 25 07:11:18 PDT 2011


Andrej Mitrovic wrote:

> import std.typetuple;
> import std.typecons;
> 
> struct Foo
> {
>     void test(int x, double y) { }
> 
>     void opOpAssign(string op, T...)(T t)
>         if (op == "~")
>     {
>         test(t);
>     }
> }
> 
> void main()
> {
>     Foo foo;
>     foo.opOpAssign!"~"(4, 5.0);  // ok
>     foo ~= tuple(4, 5.0);  // fail
> }
> 
> If I understand this correctly in the first call T becomes a D
> language tuple, while in the second one it's a phobos library tuple. I
> really hate this distinction and would love these two to be merged so
> the second call could compile.

.expand on Tuple and generally .tupleof does the trick. Language tuples are 
quite different and more general than typecons Tuple. If tuples would 
automatically expand, this would not be possible:

import std.typetuple;
import std.typecons;
import std.stdio;

struct Foo
{
    void test(Tuple!(int, int), double y) { writeln("overload a"); }
    void test(int, int, double y) { writeln("overload b"); }

    void opOpAssign(string op, T...)(T t)
        if (op == "~")
    {
        test(t);
    }
}

void main()
{
    Foo foo;
    foo.opOpAssign!"~"(tuple(4, 2), 5.0);// overload a
    foo.opOpAssign!"~"(tuple(4, 2).tupleof, 5.0);// overload b
}


More information about the Digitalmars-d-learn mailing list