Now that's a DIP that could use some love

Alexandru Ermicioi alexandru.ermicioi at
Fri Sep 18 16:02:50 UTC 2020

On Friday, 18 September 2020 at 15:43:44 UTC, Meta wrote:
> enum string failConstraint(string name, string msg, Args...) = 
> `alias %s = AliasSeq!(false, %s)`.format(Args[0], 
> processArgs!(Args[1..$])); //processArgs is a helper template 
> that converts types to string, etc...
> template isInputRange(R)
> {
>     static if (!is(typeof(R.init) RInit == R))
>         mixin(failConstraint!(isInputRange, `%s.init must have 
> type %s, but it has type %s`, R, R, RInit);
>     else static if (!is(ReturnType!((R r) => r.empty) REmpty == 
> bool))
>         mixin(failConstraint!(isInputRange, `ReturnType!((%s r) 
> => r.empty) must be of type bool, but it is %s`, R, REmpty);
>     else static if (...)
>         ...etc.
>     else
>         enum isInputRange = true;
> }

Why not return a struct that has result of test and message for 
it (was mentioned before, in original discussion about multiple 
if constraints)?

It can also be improved to aggregate multiple error messages from 
different tests inside a template like isInputRange!T.


More information about the Digitalmars-d mailing list