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