union так как его поля находятся в одной области памяти. Ну и так как Copy не хотелось бы навешивать, то остаётся только с ManuallyDrop. Как-то такfn cast_me<T: 'static, U: 'static>(value: T) -> Result<U, T> {
if value.type_id() != TypeId::of::<U>() {
return Err(value);
}
union Wrapper<T, U> {
t: ManuallyDrop<T>,
u: ManuallyDrop<U>,
}
unsafe {
let wrapper: Wrapper<T, U> = Wrapper {
t: ManuallyDrop::new(value),
};
Ok(ManuallyDrop::into_inner(wrapper.u))
}
}