Extract base type of any array?

jfondren julian.fondren at gmail.com
Sun Sep 19 04:20:00 UTC 2021


On Sunday, 19 September 2021 at 03:58:41 UTC, Kirill wrote:
> How can I get the base type of any 
> (multidimensional/static/dynamic/associative) array?
>
> Example:
> ```
> void main() {
>     int[][] intArr;
>     double[4][] doubleArr;
>     string[string][] strArr;
>
>     intArr.example; // T = int
>     doubleArr.example; // T = double
>     strArr.example; // T = string
> }
>
> void example(T)(<...> data) {
>     // extract the base of data (inside func's body or in <...>)
>     // preferably, T must become data's base type
> }
> ```

This almost works, but as `string` is an array type it needs some 
kind of rule to stop there:

```d
unittest {
     int[] intArr;
     double[4][] doubleArr;
     string[string][][] strArr;

     assert(is(BaseType!(typeof(intArr)) == int));
     assert(is(BaseType!(typeof(doubleArr)) == double));
     assert(is(BaseType!(typeof(strArr)) == immutable(char)));
}

template BaseType(T) {
     static if (__traits(isStaticArray, T))
         alias BaseType = BaseType!(typeof(T.init[0]));
     else static if (is(T == U[], U))
         alias BaseType = BaseType!U;
     else static if (is(T == V[K], K, V))
         alias BaseType = BaseType!V;
     else
         alias BaseType = T;
}
```

mix of BaseType!T from core.internal.array.equality and rank!T 
from Philippe Sigaud's D Templates Tutorial at 
https://github.com/PhilippeSigaud/D-templates-tutorial


More information about the Digitalmars-d-learn mailing list