On Sunday, 27 July 2014 at 08:40:42 UTC, Marc Schütz wrote:
On Sunday, 27 July 2014 at 00:43:40 UTC, H. S. Teoh via Digitalmars-d-learn wrote:
On Sat, Jul 26, 2014 at 05:14:44PM +0000, via Digitalmars-d-learn wrote:
Hmmm... thinking about it, is this possible?

1. Remove the constraints to match anything.
2. Inside the template, have some construct that enumerates all possible overloads and UFCS functions that are visible at the point of instantiation. 3. If this set contains only the current template, use a static assert
to print the message.
4. Otherwise, make the template fail to compile somehow (for example,
evaluate a semantically invalid expression), and hope that the
compiler will then take the other overloads into consideration
(SFINAE).

Could this work?

D does not have SFINAE.

http://dlang.org/templates-revisited.html says otherwise.

But thinking about it, I've never seen it used anywhere, nor used it myself, and even the examples in the linked article under the SFINAE section use `is` expressions instead...

It's poorly worded: "is" is what functionally replaces the SFINAE functionality.


This has been discussed before. I proposed the following solution:

- Sig constraints should match all types that the function *logically* accepts -- even if the current implementation does not support some of
 said types.

- In the function body, use a `static if` chain to implement
 specializations.

- In the final else clause, do a static assert(0) with a user-friendly
 error message.

But this prevents other people from providing overloads in their own modules :-(

Not quite: It prevents users from providing "un-ambigous" overloads. But arguably, it's a good thing.

I've argued before against the "over use" of template constraints for type validation. Their initial use was really to restrict the "logical types" that can be used, and help with template overload. Not for validation. If the type then has some "flaw", that's where the static ifs come in.

This as a several advantages:
- Cleaner interface (*cough* http://dlang.org/phobos/std_algorithm.html#sort *cough*) - Better error messages in case of non match ("The provided range can not be stable sorted, because its elements are not lvalues"). - Prevents "overload" turning into a hijack. You can add your overload (without ambiguity) if it works on types completely un-related. That won't be ambiguous. But if you are adding a very specific variant, it might be better that your function can't be accidentally called, and create surprises later.

Reply via email to