How to get the element type of an array?

Jon Degenhardt jond at noreply.com
Tue Aug 25 08:38:13 UTC 2020


On Tuesday, 25 August 2020 at 05:02:46 UTC, Basile B. wrote:
> On Tuesday, 25 August 2020 at 03:41:06 UTC, Jon Degenhardt 
> wrote:
>> What's the best way to get the element type of an array at 
>> compile time?
>>
>> Something like std.range.ElementType except that works on any 
>> array type. There is std.traits.ForeachType, but it wasn't 
>> clear if that was the right thing.
>>
>> --Jon
>
> I'm curious to know what are the array types that were not 
> accepted by ElementType ( or ElementEncodingType ) ?

Interesting. I need to test static arrays. In fact 'ElementType' 
does work with static arrays. Which is likely what you expected.

I assumed ElementType would not work, because static arrays don't 
satisfy 'isInputRange', and the documentation for ElementType 
says:

> The element type is determined as the type yielded by r.front 
> for an object r of type R. [...] If R doesn't have front, 
> ElementType!R is void.

But, if std.range is imported, a static array does indeed get a 
'front' member. It doesn't satisfy isInputRange, but it does have 
a 'front' element.

The situation is still confusing though. If only 
'std.range.ElementType' is imported, a static array does not have 
a 'front' member, but ElementType still gets the correct type. 
(This is where the documentation says it'll return void.)

--- Import std.range ---
@safe unittest
{
     import std.range;

     ubyte[10] staticArray;
     ubyte[] dynamicArray = new ubyte[](10);

     static assert(is(ElementType!(typeof(staticArray)) == ubyte));
     static assert(is(ElementType!(typeof(dynamicArray)) == 
ubyte));

     // front is available
     static assert(__traits(compiles, staticArray.front));
     static assert(__traits(compiles, dynamicArray.front));

     static assert(is(typeof(staticArray.front) == ubyte));
     static assert(is(typeof(dynamicArray.front) == ubyte));
}

--- Import std.range.ElementType ---
@safe unittest
{
     import std.range : ElementType;

     ubyte[10] staticArray;
     ubyte[] dynamicArray = new ubyte[](10);

     static assert(is(ElementType!(typeof(staticArray)) == ubyte));
     static assert(is(ElementType!(typeof(dynamicArray)) == 
ubyte));

     // front is not available
     static assert(!__traits(compiles, staticArray.front));
     static assert(!__traits(compiles, dynamicArray.front));

     static assert(!is(typeof(staticArray.front) == ubyte));
     static assert(!is(typeof(dynamicArray.front) == ubyte));
}

This suggests the documentation for ElementType not quite correct.



More information about the Digitalmars-d-learn mailing list