Auto recursive function

thedeemon via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jan 12 04:09:34 PST 2017


On Wednesday, 11 January 2017 at 19:23:10 UTC, Razvan Nitu wrote:
> Hi,
>
> I am currently trying to create a function 
> makeMultidimensionalArray which allocates memory for a 
> multidimensional array.

You were very close to the answer:

auto makeMultidimensionalArray(int N, T, Allocator)(auto ref 
Allocator alloc, size_t[N] lengths)
{
     static if (lengths.length == 1)
     {
         return makeArray!T(alloc, lengths[0]);
     }
     else
     {
         alias E = typeof(makeMultidimensionalArray!(N-1,T)(alloc, 
lengths[1..$]));
         auto ret = makeArray!E(alloc, lengths[0]);
         foreach (ref e; ret)
             e = makeMultidimensionalArray!(N-1, T)(alloc, 
lengths[1..$]);
         return ret;
     }
}


The key point is that return type depends on length of "lengths" 
array (dimensionality), so if this length is only known at 
runtime this is a dependent type, something D lacks (you'll need 
Idris or Agda for those). In D return type must be known at 
compile time and hence the length of "lengths" must be a compile 
time argument. With such argument everything compiles smoothly.


More information about the Digitalmars-d-learn mailing list