| |
| Posted by Steven Schveighoffer in reply to jfondren | PermalinkReply |
|
Steven Schveighoffer
Posted in reply to jfondren
| On 9/19/21 12:20 AM, jfondren wrote:
> 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:
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
You just need a case for it:
static if(is(immutable(T) == immutable(string)))
alias BaseType = T;
else ... // everything else
-Steve
|