On Friday, 11 November 2016 at 11:49:25 UTC, RazvanN wrote:
I am a bit confused about how the is operator works. I have a
function which receives an InputRange and a predicate. Now I
need to be able to test if the InputRange is actually a
SortedRange. I don't care about how the datatypes behind the
SortedRange or the predicate, I just need to see if the object
is a SortedRange. I have tried the following test:
static if(is(typeof(haystack) == SortedRange!(T, _pred), T,
_pred))
where haystack is the InputRange, but the test fails. Is there
a way to test if the InputRange is a SortedRange without having
to explicitly pass the primitive tupe on top of which the
SortedRange is built?
template isSortedRange(T) {
private import std.range : SortedRange;
static if (is(T : SortedRange!TT, TT)) {
enum isSortedRange = true;
} else {
enum isSortedRange = false;
}
}
void main () {
import std.algorithm : sort;
int[] a;
a ~= [1, 6, 3];
auto b = a.sort;
pragma(msg, typeof(b));
pragma(msg, isSortedRange!(typeof(a))); // false
pragma(msg, isSortedRange!(typeof(b))); // true
}