Tuple and tie?
H. S. Teoh via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Jul 8 12:39:22 PDT 2014
On Tue, Jul 08, 2014 at 07:02:17PM +0000, NCrashed via Digitalmars-d-learn wrote:
[...]
> auto tie(StoreElements...)(ref StoreElements stores)
[...]
Here's my take on it, that doesn't need to use pointers:
import std.typecons;
template TypesOf(T...)
{
static if (T.length == 1)
alias TypesOf = typeof(T[0]);
else
alias TypesOf = TypeTuple!(typeof(T[0]), TypesOf!(T[1..$]));
}
@property void tie(T...)(Tuple!(TypesOf!T) t)
{
foreach (i, ref var; T)
{
T[i] = t[i];
}
}
Tuple!(int, string) func() {
return tuple(1, "a");
}
void main()
{
int x;
string y;
tie!(x,y) = func();
import std.stdio;
writefln("%d %s", x, y);
}
It does involve some slightly more arcane template magic, though. ;-)
Basically, the TypesOf template transforms a list of alias arguments
into a list of the types of said arguments, so that we can match a list
of variables to the Tuple that is to be assigned to them.
This also (ab)uses the fact that assigning to a function call gets
interpreted in this context as setting a global @property, so there's no
need to overload opAssign at all. (Arguably, this makes it more an
insane hack than a clever solution!)
T
--
Once the bikeshed is up for painting, the rainbow won't suffice. -- Andrei Alexandrescu
More information about the Digitalmars-d-learn
mailing list