On Monday, 25 April 2016 at 17:52:58 UTC, Andrei Alexandrescu
wrote:
Idea #1: Detect and use CNF, print which clause failed
====
I prefer this one, because it should work without modifying
library or user code.
Idea #2: Allow custom error messages
====
The basic idea here is to define pragma(err, "message") as an
expression that formats "message" as an error and returns
false. Then we can write:
R find(R, E)(R range, E elem)
if ((isInputRange!R || pragma(err, R.stringof~" must be an
input range")
&&
(is(typeof(range == elem) == bool) || pragma(err, "..."))
Currently, there is no boolean short-cut evaluation in template
constraints, see:
bool foo()() {
pragma(msg, "foo");
return true;
}
bool bar()() {
pragma(msg, "bar");
return true;
}
void main() {
static assert(__traits(compiles, foo() || bar()));
}
Prints "foo" and "bar", even though bar() wouldn't need to be
evaluated anymore after foo() returned true.