LINUX.ORG.RU

История изменений

Исправление 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.