Detecting ElementType of OutputRange

Vijay Nayar madric at gmail.com
Sat Feb 26 15:46:39 UTC 2022


On Saturday, 26 February 2022 at 12:39:51 UTC, Stanislav Blinov 
wrote:
>
> Considering that `put` is quite typically implemented as a 
> template, I don't think that would be possible in general.

That is what I found as well, for example, the implementation of 
`put` from `Appender` and `RefAppender`, thus the algorithm fails 
to detect the `put` methods.

> The question is, do you really need that? Your 
> `BufferedOutputRange` can test the underlying range using 
> `isOutputRange` in its own implementation of `put`, where the 
> type of element is known, i.e. to test whether it can 
> bulk-write a slice (or a range of) elements or has to make 
> per-element calls to `put`.

This is exactly what I was doing, having the user pass in the 
element type themselves, and then the BufferedOutputRange check 
for both `isOutputRange!(ORangeT, ElemT)` and 
`is(typeof(ORangeT.init.put([ ElemT.init ])))`. In short, 
`isOutputRange` has many ways to be satisfied, 
(https://dlang.org/phobos/std_range_primitives.html#.put), but I 
want to restrict things further to only output streams that can 
do a bulk put.

Thanks for you advice. While automatic detection would be a nice 
convenience, it's not a deal breaker and it's also not 
unreasonable to expect the caller to know the element type they 
are inserting either.




More information about the Digitalmars-d-learn mailing list