Transforming an argument list
ag0aep6g via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Jun 20 14:31:07 PDT 2017
On 06/20/2017 10:28 PM, Jean-Louis Leroy wrote:
> Any ideas? Thanks...
1) You can foreach over args:
----
void test(string name, int val)
{
import std.stdio;
writefln("%s = %d", name, val);
}
T double_int(T)(T val) { return val; }
int double_int(int val) { return 2 * val; }
void double_ints(F, A...)(F f, A args)
{
foreach (ref arg; args) arg = double_int(arg);
f(args);
}
void main()
{
double_ints(&test, "1 + 2", 3);
}
----
2) Or you could make a generic `tuple_map` function and use that:
----
/* ... test, double_int, and main as above ... */
auto tuple_map(alias fun, T ...)(T things)
{
import std.typecons: Tuple, tuple;
static if (things.length == 0) return tuple();
else
{
auto head = fun(things[0]);
auto tail = tuple_map!fun(things[1 .. $]);
return tuple(head, tail.expand);
}
}
void double_ints(F, A...)(F f, A args)
{
f(tuple_map!double_int(args).expand);
}
----
More information about the Digitalmars-d-learn
mailing list