Наиболее кратким так, что я могу думать о том, что делать в данный момент
struct Foo(T, U)
if(is(typeof(T[0] < T[0])) && is(typeof(U[0] < U[0])))
{
}
, но я бы, вероятно, объявить его как
struct Foo(T, U)
if(is(typeof(T.init < T.init)) && is(typeof(U.init < U.init)))
{
}
потому что это более прямолинейно. Некоторые люди могут использовать использование статических массивов, запутывающих, и это необязательно. Но это технически немного короче.
: bool
часть в murphyslaw's answer на самом деле не нужно, потому что <
не может привести ни к чему, кроме bool
, потому что компилятор переводит <
, <=
, >
и >=
на вызовы opCmp
на определяемые пользователем типы, поэтому программист не имеет возможности сделать их результатом чего угодно, кроме bool
(и, конечно, операторы сравнения приводят к bool
для встроенных типов). Но murphyslaw's answer будет работать так же хорошо. Это просто более подробный, чем требуется.
Основное место, которое : bool
или == bool
потребовалось бы если бы вы хотели, чтобы принять предикат, а не использовать операторы сравнения непосредственно (с тех пор, вы имеете дело с произвольной функцией), и это обычно то, что общий алгоритмы в Phobos в конечном итоге делают. например подпись одного из перегрузок find
«s является
InputRange find(alias pred = "a == b", InputRange, Element)
(InputRange haystack, Element needle)
if (isInputRange!InputRange &&
is (typeof(binaryFun!pred(haystack.front, needle)) : bool))
{...}
Но если вы планируете использовать операторы сравнения непосредственно, а затем просто проверить, что они компилировать достаточно.