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.