import std.stdio, std.typecons;
/* TESTING FUNCTION */
int[] foo(T...)(T args)
{
writeln("Called foo ...");
foreach (i, arg; args)
writefln(" args[%d] == %s", i, arg);
writeln("... foo end");
return [ 5, 10, 15, 20 ];
}
/* UNPACKER */
auto unpack(alias fun, V...)(ref Tuple!V t)
{
auto f(size_t i, U...)(U args)
{
/* 2.043 and newer - t[i - 1] would work just fine */
static if (i == 0)
return fun(args);
else
return f!(i - 1)(t.field[i - 1], args);
}
return f!(V.length)();
}
/* main */
void main()
{
auto tup = tuple(
5, 3.14f, "hello world", [ 5, 10, 15 ], [ "foo":5, "bar":10 ]
);
auto ret = unpack!foo(tup);
writeln("retval from foo: ", ret);
}
aW1wb3J0IHN0ZC5zdGRpbywgc3RkLnR5cGVjb25zOwoKLyogVEVTVElORyBGVU5DVElPTiAqLwoKaW50W10gZm9vKFQuLi4pKFQgYXJncykKewogICAgd3JpdGVsbigiQ2FsbGVkIGZvbyAuLi4iKTsKICAgIGZvcmVhY2ggKGksIGFyZzsgYXJncykKICAgICAgICB3cml0ZWZsbigiICAgIGFyZ3NbJWRdID09ICVzIiwgaSwgYXJnKTsKICAgIHdyaXRlbG4oIi4uLiBmb28gZW5kIik7CgogICAgcmV0dXJuIFsgNSwgMTAsIDE1LCAyMCBdOwp9CgovKiBVTlBBQ0tFUiAqLwoKYXV0byB1bnBhY2soYWxpYXMgZnVuLCBWLi4uKShyZWYgVHVwbGUhViB0KQp7CiAgICBhdXRvIGYoc2l6ZV90IGksIFUuLi4pKFUgYXJncykKICAgIHsKICAgICAgICAvKiAyLjA0MyBhbmQgbmV3ZXIgLSB0W2kgLSAxXSB3b3VsZCB3b3JrIGp1c3QgZmluZSAqLwogICAgICAgIHN0YXRpYyBpZiAoaSA9PSAwKQogICAgICAgICAgICByZXR1cm4gZnVuKGFyZ3MpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIGYhKGkgLSAxKSh0LmZpZWxkW2kgLSAxXSwgYXJncyk7CiAgICB9CiAgICByZXR1cm4gZiEoVi5sZW5ndGgpKCk7Cn0KCi8qIG1haW4gKi8KCnZvaWQgbWFpbigpCnsKICAgIGF1dG8gdHVwID0gdHVwbGUoCiAgICAgICAgNSwgMy4xNGYsICJoZWxsbyB3b3JsZCIsIFsgNSwgMTAsIDE1IF0sIFsgImZvbyI6NSwgImJhciI6MTAgXQogICAgKTsKCiAgICBhdXRvIHJldCA9IHVucGFjayFmb28odHVwKTsKICAgIHdyaXRlbG4oInJldHZhbCBmcm9tIGZvbzogIiwgcmV0KTsKfQ==