Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #![feature(raw, const_transmute)]
- #![deny(bare_trait_objects)]
- use ::std::*;
- pub
- trait Trait {
- fn method_1 (&'_ self);
- fn method_2 (&'_ self, _: i32) -> i32;
- }
- struct Double;
- impl Trait for Double {
- fn method_1 (self: &'_ Self)
- {
- eprintln!("Double");
- }
- fn method_2 (self: &'_ Self, x: i32) -> i32 { 2 * x }
- }
- struct Triple;
- impl Trait for Triple {
- fn method_1 (self: &'_ Self)
- {
- eprintln!("Triple");
- }
- fn method_2 (self: &'_ Self, x: i32) -> i32 { 3 * x }
- }
- const DOUBLE_AS_DYN_TRAIT_VTABLE: *mut () = unsafe {
- mem::transmute::<*const dyn Trait, raw::TraitObject>(
- ptr::null::<Double>()
- ).vtable
- };
- fn foo (object: &'_ dyn Trait)
- {
- object.method_1();
- let _ = object.method_2(42);
- }
- fn main ()
- {
- dbg!(DOUBLE_AS_DYN_TRAIT_VTABLE);
- foo(&Double);
- eprintln!("vtable: {:p}",
- unsafe { mem::transmute::<&dyn Trait, raw::TraitObject>(&Double) }.vtable,
- // unsafe { **(mem::transmute::<&dyn Trait, raw::TraitObject>(&Double).vtable as *mut *mut usize) },
- );
- foo(&Triple);
- eprintln!("vtable: {:p}",
- unsafe { mem::transmute::<&dyn Trait, raw::TraitObject>(&Triple) }.vtable,
- );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement