Detecting ElementType of OutputRange
madric at gmail.com
Sat Feb 26 15:46:39 UTC 2022
On Saturday, 26 February 2022 at 12:39:51 UTC, Stanislav Blinov
> 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