On Saturday, 25 June 2016 at 09:12:12 UTC, Lodovico Giaretta wrote:
On Saturday, 25 June 2016 at 09:07:19 UTC, Lodovico Giaretta wrote:

Instead of passing functions to match!, pass pairs of arguments, like this:

    match!(T,
        int, writeln("Matched int"),
        is(T : SomeObject), writeln("Derives from SomeObject");
    );

Now, in the implementation, foreach pair of arguments, if the first member is a type that matches your target, perform that branch; otherwise, if the first member is a boolean value, and it is true, perform the branch.

Of course I meant:

     match!(T,
         int, () {writeln("Matched int");},
is(T : SomeObject), () {writeln("Derives from SomeObject");}
     );


Thanks for the help, both. This appeared to work, until I realised the lambda isn't static:

  void match(T, cases...)() {
    static if (cases.length == 1) cases[0]();
    else static if (cases.length > 2) {
      static if (is(typeof(cases[0]) == bool)) {
        static if (cases[0]) cases[1]();
        else match!(T, cases[2 .. $]);
      }
      else static if (is(T == cases[0])) cases[1]();
      else match!(T, cases[2 .. $]);
    }
  }

  void test(T)(T value) {
    int i;
    string s;
    match!(T,
      int, () => i = value,
      string, () => s = value
    );
  }

  test(1);
  test("A string");

The compiler complains about not being able convert an int to a string and vice versa.

Reply via email to