On Monday, 26 October 2015 at 21:27:37 UTC, Walter Bright wrote:
and we're not supposed to break existing code. But the alternative, which is redoing every template that accepts an InputRange, seems an awfully heavy burden. Even if we do this change pervasively in Phobos, how does that help anyone else who uses InputRanges?

Tl,dr: the alias this in DirEntry is an abusive bad practice, and should never have happened.

I agree that for DirEntry it may have been dubious practice, but it is a problem in general.

Since nobody else is making the case for the elephant in the room, I'll make the case for changing IFTI to consider AliasThis. Please excuse the informal and clumsy presentation.

Let's use isDir as our function template and DirEntry as the offending subtype:

---
@property bool isDir(R)(R name) if (isInputRange!R && isSomeChar!(ElementEncodingType!R));

foreach(f; dirEntries("/", "*", SpanMode.shallow, false))
    if(isDir(f)) // Error
        ...
---

Errors with: "Error: template std.file.isDir cannot deduce function from argument types !()(DirEntry)"

IFTI is in effect when calling isDir: isDir!DirEntry is attempted, which doesn't match the template constraints.

However, explicitly instantiating isDir to receive the supertype works:

---
foreach(f; dirEntries("/", "*", SpanMode.shallow, false))
    if(isDir!string(f)) // OK
        ...
---

This gives us the same behaviour we had before templatization: the argument is implicitly converted to the supertype at the call-site.

An IFTI rule supporting this doesn't have to be complicated AFAICS: if there are no matches for exact type T, recursively try supertypes of T until first match. If no matches, error out. If more than one match at one level of AliasThis (hypothetical multiple AliasThis), error out.

Interestingly, a side effect would be that it gives more importance to template constraints. I don't know if that's a good or a bad thing.
_______________________________________________
phobos mailing list
phobos@puremagic.com
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to