how to do this meta-programming? print the address of random element's address of a variable length of arrays?

mw mingwu at gmail.com
Sat Sep 12 18:16:51 UTC 2020


On Saturday, 12 September 2020 at 14:31:59 UTC, Paul Backus wrote:
> On Saturday, 12 September 2020 at 03:19:23 UTC, mw wrote:
>> I.e. I want to learn the generic meta-programming way to 
>> assemble such parameter list (&(x[i], &(y[j])) at compile 
>> time, it is possible?
>
> It's possible if you use a helper function. Here's how:
>
> import std.meta: allSatisfy;
> import std.traits: isArray;
>
> void printRandomElemAddr(Arrays...)(Arrays arrays)
>     if (allSatisfy!(isArray, Arrays))
> {
>     auto randomElemAddr(size_t i)()
>         if (i < arrays.length)
>     {
>         import std.random: uniform;
>
>         return &arrays[i][uniform(0, $)];
>     }
>
>     import std.stdio: writeln;
>     import std.meta: staticMap, aliasSeqOf;
>     import std.range: iota;
>
>     writeln(staticMap!(randomElemAddr, 
> aliasSeqOf!(iota(arrays.length))));
> }
>
> void main()
> {
>     int[] a = [1];
>     int[] b = [2, 3];
>     double[] c = [4, 5, 6];
>
>     printRandomElemAddr(a);
>     printRandomElemAddr(a, b);
>     printRandomElemAddr(a, b, c);
> }

Thanks, this works. staticMap and aliasSeqOf is the key.

Now, let me expand this challenge: suppose we need to add a new 
set of variable length extra parameters in parallel to the 
arrays, i.e:

      // just use scalar type for demo
      int    extraA;
      string extraB;
      double extraC;

      // need to be called as:
      printRandomElemAddr(extraA, a);
      printRandomElemAddr(extraA, extraB, a, b);
      printRandomElemAddr(extraA, extraB, extraC, a, b, c);


basically, two sets of variadic parameters, but need to be 
treated differently:

-- the 1st scalar set, just use as it is
-- the 2nd array set, need some processing (which you have done).

Now the question is how to pass & handle 2 sets of variadic 
parameters?



More information about the Digitalmars-d-learn mailing list