лично я бы использовал if(is(typeof(T.init != E.init) == bool))
, чтобы убедиться, что речь идет о переменных типа
(а затем, когда вы хотите, чтобы T был диапазоном (и потерять нотацию массива, это будет if(isInputRange(T) && is(typeof(T.init.front != E.init) == bool))
)
edit: лучший способ проверить подобные вещи, расширив контрольный пример:
если мы возьмем другую функцию:
int binarySearch(T,E)(T[] haystack, E needle)
if(is(typeof(haystack[0] < needle) == bool)) {
//...
return -1;
}
это компилируется и работает так, как вы ожидаете (за исключением деталей реализации ...)
но
int binarySearch(T,E)(T[] haystack, E needle)
if(is(typeof(T < E) == bool)) {
//...
return -1;
}
не (вызов binarySearch([1,2,3],0);
не компилируется)
однако, как мой оригинальный ответ:
int binarySearch(T,E)(T[] haystack, E needle)
if(is(typeof(T.init > E.init) == bool)) {
//...
return -1;
}
это работает как ожидалось