Input/Output multiple values from function
Ali Çehreli
acehreli at yahoo.com
Tue Sep 3 00:07:24 UTC 2019
On 08/27/2019 10:17 PM, Jabari Zakiya wrote:
> I can't do (a, b, c,d) = func1(i) directly.
> What do I do to assign the output of func1 to the individual variables?
I had some time to play with the following syntax, similar usage of
which has been proposed a number of times as a replacement for tuple
expansion. Assuming that foo() returns a struct of int, double, string;
the following expression will set the variables to those members:
int i;
double d;
string s;
foo(42).into!(i, d, s);
Here is the complete program:
import std.stdio;
import std.string;
struct S {
int i;
double d;
string s;
}
S foo(int i) {
return S(i, 1.5, "hi");
}
template into(args...) {
auto into(From)(From from)
if (is (From == struct))
{
static foreach (i, m; __traits(allMembers, From)) {{
alias argT = typeof(args[i]);
alias memT = typeof(__traits(getMember, from, m));
static assert (is (argT == memT),
format!"Cannot expand '%s %s.%s' into '%s %s'
argument."
(memT.stringof, From.stringof, m, argT.stringof,
args[i].stringof));
mixin (format!"args[%s] = from.%s;"(i, m));
}}
}
}
void main() {
int i;
double d;
string s;
foo(42).into!(i, d, s);
writeln(i);
writeln(d);
writeln(s);
}
I know that it does not address attributes like shared, etc. but it
shows how expressive nested templates can be.
Ali
More information about the Digitalmars-d-learn
mailing list