www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Extract base type of any array?

reply Kirill <kirill.saidov mail.com> writes:
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
}
```
Sep 18 2021
parent reply jfondren <julian.fondren gmail.com> writes:
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
Sep 18 2021
parent Steven Schveighoffer <schveiguy gmail.com> writes:
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: ```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
You just need a case for it: ```d static if(is(immutable(T) == immutable(string))) alias BaseType = T; else ... // everything else ``` -Steve
Sep 19 2021