On 2009-11-27 18:30:14 -0500, Walter Bright <newshou...@digitalmars.com> said:

But with a small feature, we can make this work:

    struct S
    {
         ...
        T opDynamic(s : string)(args...);
    }

and then s.foo(3), if foo is not a compile time member of s, is rewritten as:

    s.opDynamic!("foo")(3);

and opDynamic defers all the nuts-and-bolts of making this work out of the language and into the library.

Please make sure it can work to implement properties too.

The only thing that worries me is that "functions" defined through opDynamic won't be reachable via reflection. There's no way to call "foo" if "foo" is a runtime string; with regular functions you can use compile-time reflection to build a dispatch table, but for those implemented through opDynamic (which are not available through reflection) it won't work.

Also, I would name it "opDispatch" instead. I fail to see anything "dymamic" in it... it's a template so it's static isn't it? Of course you can implement dynamic dispatch with this, but that's not a requirement.


In particular, opDynamic's parameter and return types should all be instances of std.variant.

That seems unnecessary. It's a template, so you should be able to define opDynamic like this:

        auto opDynamic(s : string, A...)(A args) { return args[0]; }


--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/

Reply via email to