On Wednesday, 4 July 2018 at 14:07:35 UTC, Timoses 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?

IIRC to apply inout to the this pointer:

Ref opIndex(size_t idx) inout;

or
inout(Ref) opIndex(size_t idx) inout;

not sure off the top of my head,

Reply via email to