История изменений
Исправление red75prim, (текущая версия) :
Потому что параметрический полиморфизм не позволяет иметь разные реализации для разных типов. Bounded polymorphism в какой-то мере позволяет.
fn foo<T: Any>(val: T) -> T {
if TypeId::of::<u32>() == val.type_id() {
// Safe. We know than T==u32. It's ok to copy bits
unsafe {
let val = transmute_copy::<T, u32>(&val) + 1;
transmute_copy(&val)
}
} else {
val
}
}
После мономорфизации условие и transmute_copy будут удалены оптимизатором без всяких constraint propagation, которые потребуются для оптимизации версии с vtable. Условие в мономорфизированной версии будет константным true или false, transmute_copy::<u32, u32>()
- тривиальным копированием.
Bounded polymorphism со специализацией позволит это сделать без unsafe.
Исправление red75prim, :
Потому что параметрический полиморфизм не позволяет иметь разные реализации для разных типов. Bounded polymorphism в какой-то мере позволяет.
fn foo<T: Any>(val: T) -> T {
if TypeId::of::<u32>() == val.type_id() {
// Safe. We know than T==u32. It's ok to copy bits
unsafe {
let val = transmute_copy::<T, u32>(&val) + 1;
transmute_copy(&val)
}
} else {
val
}
}
Bounded polymorphism со специализацией позволит это сделать без unsafe.
Исходная версия red75prim, :
Потому что параметрический полиморфизм не позволяет иметь разные реализации для разных типов. Bounded polymorphism - в какой-то мере позволяет.
fn foo<T: Any>(val: T) -> T {
if TypeId::of::<u32>() == val.type_id() {
// Safe. We know than T==u32. It's ok to copy bits
unsafe {
let val = transmute_copy::<T, u32>(&val) + 1;
transmute_copy(&val)
}
} else {
val
}
}
Bounded polymorphism со специализацией позволит это сделать без unsafe.