Filter for opDispatch?

frame frame86 at live.com
Sat May 15 23:41:19 UTC 2021


On Friday, 14 May 2021 at 23:02:22 UTC, frame wrote:

> Thanks! I stumbled around with static asserts and mixins... 
> totally forgot about the constraints but they will to the trick.

Now I run into the error

"class Foo member s is not accessible"
"template instance Base.opDispatch!("s", int, Foo) error 
instantiating"

and I have no clue why.

I swear the original code is just simple as that and 
satisfyDispatch works fine (there is no problem if I change s to 
a simple field).

```d
abstract class Base {
   void opDispatch(string property, S, this T)(auto ref S v) // if 
(satisfyDispatch!(T, property))
   {
      __traits(getMember, cast(T) this, property) = v; // error 
reported here
   }

   auto opDispatch(string property, this T)() // if 
(satisfyDispatch!(T, property))
   {
     return __traits(getMember, cast(T) this, property);
   }
}

// other module
class Foo : Base {
   protected:
     int _s;

     // int s; // would work

     void s(int v) {
         _s = v;
     }

     int s() {
         return _s;
     }
}

// called from a method like this:
void updateValue(T, V)(V value, Object object) {
    (cast(T) object).opDispatch!(property)(value);
}

```

I first thought the compiler does a recursive call on 
__traits(getMember) but it has no problems with this simple code 
above.


More information about the Digitalmars-d-learn mailing list