On Monday, 5 March 2018 at 17:38:52 UTC, H. S. Teoh wrote:
struct Container {
auto opSlice() const {
static struct Result {
private Container impl;
private int n; // internal mutable state
@property bool empty() { ... }
... // rest of range API
}
return Result(this);
}
}
That's definitely a know problem with ranges that hasn't yet been
solved.
The known workaround is to implement Range and ConstRange.
This idiom could prolly be encapsulated in a safe and generic
template type to avoid boilerplate.
If we had some covariant mechansim to implement sth. similar to
struct Range(T) if (is(T InoutT == inout))
{
inout(InoutT) opIndex(size_t i) inout;
}
that would be ideal, but that isn't exactly trivial.
I think we had a better issue for this topic, but here is one
ticket asking for this feat.
[9983 – inout type can not be used as a parameter for structure
template](https://issues.dlang.org/show_bug.cgi?id=9983)