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);
}

Reply via email to