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).
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.