Я немного поигрался с typenum
, это работает:
use generic_array::{ArrayLength, GenericArray};
use typenum::{IsGreaterOrEqual, IsLessOrEqual, Same, B1, U100, U1024, U99};
struct Foo<T, N>
where
N: ArrayLength<T>,
N: IsGreaterOrEqual<U100, Output = True>,
N: IsLessOrEqual<U1024, Output = True>,
{
data: GenericArray<T, N>,
}
fn main() {
let f: Foo<u8, U100> = Foo {
data: GenericArray::default(),
};
// Does not compile
let f: Foo<u8, U99> = Foo {
data: GenericArray::default(),
};
}
The IsGreaterOrEqual<M>
et c. черты, что сбивает с толку, реализованы, даже когда N < M
. Вы должны получить их результат, посмотрев на соответствующий тип Output
. Если это B1
или его синоним True
, тогда N
действительно больше или равно M
.
Вы можете попытаться написать черту, связанную как <N as IsGreaterOrEqual<U100>>::Output == B1
, но это не возможно. Вы можете ограничить связанный тип, как в примере кода, или с помощью вспомогательного признака в typenum
, Same
: <N as IsGreaterOrEqual<U100>>::Output: Same<B1>
.