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