Now that's a DIP that could use some love
Adam D. Ruppe
destructionator at gmail.com
Mon Sep 14 00:12:34 UTC 2020
On Monday, 14 September 2020 at 00:00:15 UTC, Adam D. Ruppe wrote:
> While that would be possible, I believe a better DIP would be
> to let the compiler recognize the pattern and work it
> automatically for us.
Here's a slight refinement: it does the cast to bool already. So
we can return a struct with opCast. But how to get the message
out?
It could be a magic type that the compiler recognizes...
Or it could just be a pattern. Suppose template constraints as
well as static assert (heck maybe even normal assert) just looked
for a method, maybe __compileErrors. If present, it processes the
return value as supplemental errors.
Now the library defines
struct MyChecks {
bool opBool(T:bool) { return errors.length == 0; }
string[] __compileErrors;
}
MyChecks isInputRange(T)() {
MyChecks errors;
if(!hasMember!(T, "front")
errors.__compileErrors ~= "missing front";
if(!hasMember!(T, "popFront")
errors.__compileErrors ~= "missing popFront";
if(!hasMember!(T, "empty")
errors.__compileErrors ~= "missing empty";
return errors;
}
Then user code does:
static assert(isInputRange!MyThing); // automatically shows the
errors if it fails (unless the user specifies something else)
void foo(T)() if(isInputRange!T) {} // shows the errors if it
fails in addition to what it has now
Destroy.
More information about the Digitalmars-d
mailing list