On Wednesday, July 04, 2018 14:07:35 Timoses via Digitalmars-d-learn wrote: > How can I return inferred storage class from interface functions? > I can't use auto as return value in interface. Neither can I use > "inout" as I don't pass a parameter. > > // Ref Type > interface IRef > { > Ref opIndex(size_t idx) const; > } > class CRef : IRef > { > Ref[] a; > this() immutable > { this.a = [new Ref()]; } > Ref opIndex(size_t idx) const > { return a[idx]; } // Error: cannot implicitly convert > expression this.a[idx] of type const(Ref) to app.Ref > } > class Ref{} > > void main() > { > auto a = new immutable(CRef)(); > auto s = a[3]; > } > > For value types it works, I presume since they are passed by > value, so the instance returned is an actual copy of the stored > value. > > // Value Type > interface IValue > { > Value opIndex(size_t idx) const; > } > class CValue : IValue > { > this() immutable { i = [Value()]; } > Value[] i; > Value opIndex(size_t idx) const > { return i[idx]; } > } > struct Value{} > > However, for ref types this doesn't work. > > Do I have to define two `opIndex` in the interface? One mutable, > one for immutable type instances?
You can make opIndex inout instead of const. That way, inout applies to the invisible this reference, just like it would with const. - Jonathan M Davis