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