On Tuesday, 17 August 2021 at 13:14:44 UTC, Steven Schveighoffer wrote:
On 8/17/21 8:21 AM, Ferhat Kurtulmuş wrote:
Hello folks,

Hope everyone is doing fine. Considering the following code, in the first condition, I am extracting the type Point from the slice Point[]. I searched in the std.traits, and could not find a neater solution something like ElementTypeOf!T. Is there any neater solution for it? Thanks in advance.

```d
     static if (isArray!VecPoint){
         VecPoint dummy;
         alias Point = typeof(dummy[0]);
     } else static if (isRandomAccessRange!VecPoint){
         alias ASeq2 = TemplateArgsOf!VecPoint;
         alias Point = ASeq2[0];
     } else
        static assert(0, typeof(VecPoint).stringof ~ " type is not supported");
```

If you want the element type of a range (i.e. the thing returned by `range.front`), you can use `ElementType!T` (from std.range.primitives).

This returns the element type of the range, which for every array *except* character arrays, gives you the element type of the array.

If you want always the element type of the array, even for auto-decoded ranges, use `ElementEncodingType!T`.

If you know it's an array, you can just use Paul's solution.

Your `isRandomAccessRange` branch seems very suspect.

-Steve

Very informative, thanks. My code is lying here[1]. I want my struct to accept 2d static arrays, random access ranges, and "std.container.Array". I could achieve it with its present form, and I will probably slightly modify it based on your comments.

[1]: https://github.com/aferust/earcut-d/blob/master/source/earcutd.d#L34

Reply via email to