On 7/25/20 8:26 AM, FreeSlave wrote:
I want to be able to return a range of const objects from the const object and a range mutable objects from the mutable object.

inout comes to mind, but not applicable in this case, because inout must be applied to the return type as whole, which does not make much sense for the range. Defining range of inout objects does not work too. See the example.

import std.range;
class A
{
     string name;
}

class B
{
     A[] _actions;
     ForwardRange!(inout(A)) byAction() inout { // can't instance this type
         import std.algorithm : filter;
        return inputRangeObject(_actions.filter!(a => a !is null && a.name.length));
     }
}

So how can I achieve the intended effect without code duplication? (like making separate mutable and const versions of the method).

You can't exactly. The limitation that inout cannot be applied to a struct member is a crappy limitation, one which I wish I never advocated for.

The only way to do this without code duplication (but with generated code duplication) is to template the byAction function on the type of `this`:

auto byAction(this This)() { /* same implementation */ }

Note that this ONLY works if your base range type is an array. If you have a custom range type, you need to parameterize that based on the constness of `This`.

-Steve

Reply via email to