On Sunday, 4 December 2016 at 05:31:59 UTC, lobo wrote:

This works for me when specialising for input ranges, strings and arrays.

auto f(T)(T val)
    if(isInputRange!T && !isSomeString!T && !isArray!T) {}

auto f(T)(T val)
    if(isSomeString!T) {}

auto f(T)(T val)
    if(isArray!T && !isSomeString!T)

bye,
lobo

Yes, this is the same workaround I found, but that does not solve the fact that the following code does not compile:

import std.range.primitives : isInputRange;
void f(T)(T val) if (isInputRange!T)
{
  while (!val.empty) { auto c = val.front; val.popFront(); }
}

string s = "some string";
f(s);

Of course, the previous code will compile if we change the imports:
import std.range.primitives: isInputRange, front, popFront, empty;

But that just prove the bad design of isInputRange which cannot be used all alone without the rest of array UFCSs imported.

Reply via email to