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