digitalmars.D.learn - Any trick for defining an operator overload in a different namespace?
- Andrej Mitrovic (34/34) Aug 31 2013 I'm trying to achieve the syntax "opts[...] = 123", rather than using
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (6/40) Aug 31 2013 This is the limitation of inner structs' not having an 'outer'
- Andrej Mitrovic (27/29) Aug 31 2013 Right, but this was just a workaround. Anyway I did just realize I can
I'm trying to achieve the syntax "opts[...] = 123", rather than using the more direct "this[...] = 123". I can use this code: ----- class C { this() { opts = Opts(this); opts["foo"] = 1; } struct Opts { C c; void opIndexAssign(T)(T value, string option) { c.assign(option, value); } } Opts opts; private void assign(string option, int value) { } } void main() { auto c = new C(); } ----- But this explicitly stores the 'this' reference in the struct, I was wondering if anyone knows of a trick to avoid having to do that. As you can tell I just want a more convenient operator-based syntax over calling the 'assign' method, but I don't want the operator to live in the class space itself (because then I'd have to use "this[...] = that", which is a little quirky for my taste).
Aug 31 2013
On 08/31/2013 03:07 AM, Andrej Mitrovic wrote:I'm trying to achieve the syntax "opts[...] = 123", rather than using the more direct "this[...] = 123". I can use this code: ----- class C { this() { opts = Opts(this); opts["foo"] = 1; } struct Opts { C c; void opIndexAssign(T)(T value, string option) { c.assign(option, value); } } Opts opts; private void assign(string option, int value) { } } void main() { auto c = new C(); } ----- But this explicitly stores the 'this' reference in the struct, I was wondering if anyone knows of a trick to avoid having to do that. As you can tell I just want a more convenient operator-based syntax over calling the 'assign' method, but I don't want the operator to live in the class space itself (because then I'd have to use "this[...] = that", which is a little quirky for my taste).This is the limitation of inner structs' not having an 'outer' reference, right? Even if that were automatically available, it would still need a reference similar to your explicit 'c' reference. I think... :) Ali
Aug 31 2013
On 9/1/13, Ali =C7ehreli <acehreli yahoo.com> wrote:This is the limitation of inner structs' not having an 'outer' reference, right?Right, but this was just a workaround. Anyway I did just realize I can use opDispatch for this: ----- class C { this() { this.opts["foo"] =3D 1; } private auto opDispatch(string field : "opts")() { return this; } private void opIndexAssign(T)(T value, string option) { assign(option, value); } private void assign(string option, int value) { } } ----- It might seem a little funny that the only thing it does is just returns 'this', which we already had. But I wanted to avoid writing 'this["foo"] =3D 1;'. Well at the end of the day this may or may not be what I wanted, since I still want to hide opDispatch. Oh well.. :)
Aug 31 2013