bearophile <[email protected]> wrote:

But have you tried to run it? That is similar to one of my first versions, and it doesn't work, I don't know why.

You're right. Property syntax is what causes it. It only
instantiates the template with the parameter for the name.[1]


This code seems to work correctly:

struct bar {
  int[string] table;

  template opDispatch( string name ) {
    @property
    auto opDispatch( T... )( T args ) {
      static if (T.length == 0) {
        return table[name];
      } else static if (T.length == 1) {
        table[name] = args[0];
      } else {
        pragma( msg, to!string( T.length ) );
        static assert(false, "Wrong parameter count to opDispatch");
      }
    }
  }
}

void main( ) {
  bar b;
  b.foz = 34;
  writeln( b.foz( ) );
}

Note however, that property syntax does not work for the degenerate case
of 0 arguments, i.e. the getter. One has to call it without the benefit
of property syntax.

[1]: http://d.puremagic.com/issues/show_bug.cgi?id=620

--
Simen

Reply via email to