Tuple poilerplate code

WebFreak001 d.forum at webfreak.org
Tue Sep 1 12:03:26 UTC 2020


On Tuesday, 1 September 2020 at 02:08:54 UTC, JG wrote:
> [...]

Here is some fun with operator overloading and pointers, but I 
don't really like it because it seems unsafe:

import std;

auto _(T...)(return ref T refs) @safe {
     static struct Assigner(Ptrs...) {
         @disable this(this);
         private Ptrs ptrs;
         void opAssign(T)(T v) if (T.expand.length == Ptrs.length)
         {
             static foreach (i; 0 .. Ptrs.length)
                 *ptrs[i] = v[i];
         }
     }

     static Assigner!U assigner(U...)(U v) {
         return Assigner!U(v);
     }

     static string assignerCall(size_t len)() {
     	string ret = "assigner(";
         static foreach (i; 0 .. len)
             ret ~= "&refs[" ~ i.stringof ~ "], ";
         return ret ~ ")";
     }

     return mixin(assignerCall!(T.length));
}

void main()
{
     string a, b, c;
     int x;
     _(a, b, c, x) = tuple("a", "b", "c", 4);
     writeln(a, b, c, x);
     _(a, b) = tuple(b, a);
     writeln(a, b);
}


More information about the Digitalmars-d-learn mailing list