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