digitalmars.D.learn - opDispatch/template get this
- Inquie (48/48) Apr 03 2017 I am using opDispatch to wrap function calls
- John Chapman (13/61) Apr 04 2017 Make opDispatch a templated function and forward with
I am using opDispatch to wrap function calls Error: 'this' is only defined in non-static member functions, not opDispatch!"foo" class X { auto localfoo() { return 3; } template opDispatch(string name, Args...) { static if (name == `foo`) { alias opDispatch = () { return this.localfoo(); }; } which doesn't work because of this I tried template opDispatch(string name, this _this, Args...) { static if (name == `foo`) { alias opDispatch = () { return _this.localfoo(); }; } but that doesn't work either ;/ I call it like auto y = x.foo(); but foo isn't found https://dpaste.dzfl.pl/bf31f535340f class X { auto localfoo() { return 3; } auto localfoo2(int x) { return x; } template opDispatch(string name, Args...) { static if (name == `foo`) { alias opDispatch = () { return this.localfoo(); }; } static if (name == `bar`) { alias opDispatch = () { return this.localfoo2(); }; // need to be able to pass Args properly here } } } void main() { auto x = new X(); auto z = x.localfoo(); auto y = x.foo(); auto q = x.bar(); }
Apr 03 2017
On Monday, 3 April 2017 at 21:49:07 UTC, Inquie wrote:I am using opDispatch to wrap function calls Error: 'this' is only defined in non-static member functions, not opDispatch!"foo" class X { auto localfoo() { return 3; } template opDispatch(string name, Args...) { static if (name == `foo`) { alias opDispatch = () { return this.localfoo(); }; } which doesn't work because of this I tried template opDispatch(string name, this _this, Args...) { static if (name == `foo`) { alias opDispatch = () { return _this.localfoo(); }; } but that doesn't work either ;/ I call it like auto y = x.foo(); but foo isn't found https://dpaste.dzfl.pl/bf31f535340f class X { auto localfoo() { return 3; } auto localfoo2(int x) { return x; } template opDispatch(string name, Args...) { static if (name == `foo`) { alias opDispatch = () { return this.localfoo(); }; } static if (name == `bar`) { alias opDispatch = () { return this.localfoo2(); }; // need to be able to pass Args properly here } } } void main() { auto x = new X(); auto z = x.localfoo(); auto y = x.foo(); auto q = x.bar(); }Make opDispatch a templated function and forward with __traits(getMember, this, "foo") or a mixin. class X { auto localfoo() { return 3; } auto localfoo2(int x) { return x; } auto opDispatch(string name, Args...)(auto ref Args args) { static if (name == "foo") return __traits(getMember, this, "localfoo")(args); else static if (name == "bar") mixin("return localfoo2(args);"); } }
Apr 04 2017