Как я могу использовать дженерики с размером, который известен во время компиляции (являются Sized
) как длина массива структур в зависимости от их размера
У меня есть следующая ошибка:
error: generic parameters may not be used in const operations
--> src/lib.rs:4:43
|
4 | arr: [Key; 1024 / std::mem::size_of::<Key>()]
| ^^^ cannot perform const operation using `Key`
|
= note: type parameters may not be used in const expressions
для следующего кода
type SomeKey = u64;
// This does not work
struct NotWorking<Key: Sized> {
arr: [Key; 1024 / std::mem::size_of::<Key>()]
}
struct Working {
arr: [SomeKey; 1024 / std::mem::size_of::<SomeKey>()]
}
В настоящее время это невозможно в стабильной версии, для этого требуется #![feature(generic_const_exprs)] и, следовательно, каждую ночь:
#![feature(generic_const_exprs)]
struct NotWorking<Key>
where
// this where clause is required to constrain the generic, once GCEs
// are complete its need might go away.
[(); 1024 / std::mem::size_of::<Key>()]:,
{
arr: [Key; 1024 / std::mem::size_of::<Key>()],
}
Обратите внимание, что в
Key: Sized
Sized
является избыточным, поскольку оно неявно, т. е.Key: Sized
то же самое, что и простоKey
.