On 02/10/2012 02:47 AM, bearophile wrote:
Once this patch is applied:
https://github.com/D-Programming-Language/dmd/pull/692
you are able to write something like this, that isn't exceptionally nice
looking, but it's useful (it's going to make Phobos code a bit more hairy, but
the user is going to see some better error messages):
template IsNumberWithError(T, string file, int line) {
enum bool IsNumberWithError = is( ...
static if (!IsNumberWithError)
__ctfeWriteln(file, "(", line, "): '", typeid(T), "' is not a
number.");
}
double gsqrt(T)(T x) if (IsNumberWithError!(T, __FILE__, __LINE__)) { /*...*/ }
__ctfeWriteln is not required (it is not a declaration, therefore it
probably won't work). pragma(msg, ...) can already be used for that purpose.
template IsNumberWithError(T, string file, int line) {
enum bool IsNumberWithError = is( ...
static if (!IsNumberWithError)
pragma(msg,file, "(", line, "): '", T, "' is not a number.");
}
An alternative is to give an else to the template constraints, but the error
message is at the bottom of the function, making it not easy to find, so I
don't like this syntax:
int spam(T)(T x) if (IsFoo!T || IsBar!T) {
// ...
} else {
__ctfeWriteln("'", typeid(T), "' is not Foo or Bar.");
}
I like it. The else clause could perform arbitrary checks to make the
error message as helpful as possible.