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

Ali Çehreli acehreli at
Sat Sep 12 03:11:09 UTC 2020

On 9/11/20 6:44 PM, mw wrote:> e.g.
 > int[] a = new int[la];
 > int[] b = new int[lb];
 > int[] c = new int[lc];
 > int[] d = new int[ld];
 > the func I want to write, e.g. for 2 arrays (instantiation) is like this:
 > void print_random_elem_addr(int[] x, int[] y) {
 >    auto i = random_int_between(0, x.length);
 >    auto j = random_int_between(0, y.length);
 >    print(&(x[i], &(y[j]));  // only single print() func call allowed!
 > }
 > But I want one generic function, which can be called as:
 > print_random_elem_addr(a, b);
 > print_random_elem_addr(a, b, c);
 > print_random_elem_addr(a, b, c, d);

If they are all of same type like int[] in this case, then you can 
variable number of parameters, which means "any number of int[] arrays" 
below, elements of which can be called either as separate arguments or 
as a single array argument:

import std.stdio;
import std.random;

void print_random_elem_addr(int[][] arrays...) {
   foreach (i, array; arrays) {
     const chosen = uniform(0, array.length);
     writefln!"Array %s, element %s: %s"(i, chosen, &array[chosen]);

void main() {
   auto randomLengthArray() {
     return new int[uniform(1, 101)];

   auto a = randomLengthArray();
   auto b = randomLengthArray();
   auto c = randomLengthArray();

   writeln("As independent arguments:");
   print_random_elem_addr(a, b, c);

   writeln("As a single argument:");
   print_random_elem_addr([a, b, c]);

Warning: The array that is automatically generated by the first 
print_random_elem_addr() call in main() is short-lived: You cannot store 
a slice of it because the array that contains the arguments may be 
destroyed upon leaving the function (e.g. in the "independent" case above).

Here is some more information:

There are other ways of doing the same thing. For example, if you want 
to work with different ranges, you can use tuple template parameters:


More information about the Digitalmars-d-learn mailing list