April 03, 2017 opDispatch/template get this | ||||
---|---|---|---|---|
| ||||
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(); } |
April 04, 2017 Re: opDispatch/template get this | ||||
---|---|---|---|---|
| ||||
Posted in reply to Inquie | 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);");
}
}
|
Copyright © 1999-2021 by the D Language Foundation