On Monday, 25 June 2018 at 13:37:01 UTC, Mr.Bingo wrote:

One can overload assignment and dispatch so that something like

A.x = ... is valid when x is not a typical member but gets resolved by the above functions.

Therefore, I can create a member for assignment. How can I create a member for getting the value?

A.x = 3; // Seems to get translated in to A.opDispatch!("x")(3)

works but

foo(A.x); // fails and the compiler says x does not exist


I need something consistent with opDot. I am trying to create "virtual"(not as in function) fields and I can only get assignment but not accessor.

A.x is translated in to A.opDispatch!"x" with no args. So I guess you can overload or you can static if on a template parameter sequence:

import std.stdio;
struct S {
    auto opDispatch(string name, Args...)(Args args) {
        static if (!Args.length) {
            return 3;
        } else {
            // set something
        }
    }
}
void main()
{
    S s;
    s.x = 3;
    writeln(s.x);
}

Cheers,
- Ali

Reply via email to