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)

Reply via email to