Есть ли способ, которым я могу статически знать размер T?
Да, вы знаете размер во время компиляции. Но размер может варьироваться и не является постоянным. Вместо использования массива фиксированного размера вы можете использовать вектор, который является непрерывным растущим массивом.
Кроме того, Sized
- это признак отказа от маркера. Все параметры типа имеют неявную границу Sized
. Вам не нужно излагать этот факт.
Вам нужен защитный ограждение, чтобы использовать шаблон, совпадающий с тем, что вы делали, но здесь проще использовать выражение if-else.
В общем, это работает:
fn i_from_slice<T>(slice: &[u8]) -> Option<T> {
let n = std::mem::size_of::<T>();
if slice.len() == n {
let mut buf = vec![0; n];
buf.copy_from_slice(slice);
Some(unsafe { std::mem::transmute_copy(&buf) })
} else {
None
}
}