On Sunday, 12 March 2017 at 03:23:21 UTC, Jonathan M Davis wrote:
...

First off, I'd like to point out that creating specific overloads for alias this-ed structs is a bad idea, because you just have to ask the user to do this

MyCustomType { string b; alias b this; }

MyCustomType a;
foo!(string)(a);

instead of

MyCustomType a;
foo(a);

And I think making the conversion on the user is better, because once we go down the rabbit hole of offering custom template support for user defined alias this-ed types, there's almost no bottom. You have to do the same thing to every templated function that uses traits like isNumeric, isPointer, etc.

So with that in mind, your proposal for alias this overloads of

auto foo(C)(C[] str)
    if(isSomeChar!C)
{...}

Isn't really helpful for either because it still clutters code with an extra overload. I think the problem we need to accept is that alias this and template will always be sort of oil and water.

I don't know if we should change the current overloads, as people complained with std.file was range-ified and their code using DirEntry broke. That's honestly what started this whole mess, and honestly in hindsight we should have marked the issue as won't fix and told them to use the above method. But people (including me) wanted the regression fixed which is totally understandable.

Maybe we should deprecate the isConvertibleToString overloads, maybe not. But we really shouldn't add more.

As such, I think that code using isSomeString in a context where an
enum would pass needs to either be changed so that the function
accepts only strings and uses !is(S == enum) to prevent enums from passing

How much longer until we're at "Effective D: 55 things you shouldn't do because it's buggy and you don't know it".

*sigh* I know what my PRs are going to be for the next two weeks.

So, that could be repeated a fair bit in templated code. We _could_
shorten that to something like isSomeCharRange!R, but as soon as
you need a forward range or greater, you're going to end up with
something like

isForwardRange!R && isSomeCharRange!R
whereas right now it would be
isForwardRange!R && isSomeChar!(ElementType!R)

Well, that kills that idea, doesn't it?

Consider changing isSomeString and isNarrowString so that they are false for enums - since they really should be - but we probably can't do that without breaking at least some code (albeit mostly code that's going to
be buggy anyway).

Can't agree here. We don't know how much code we'd be breaking. The move towards deprecation of old behavior is the best for users, and that's not really possible here. The best thing to do is make the docs very explicit.

If we don't make that change, we should consider adding
isExactSomeString to std.traits

Also disagree. Making more traits on top of an already confusing situation is a non-starter for me. Again, I think we just need to make the docs better here.

Reply via email to