Returning range of inout objects from inout method

Steven Schveighoffer schveiguy at gmail.com
Sat Jul 25 14:19:15 UTC 2020


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


More information about the Digitalmars-d-learn mailing list