In Rust, a &T
where T
is a trait
is a fat reference, which actually corresponds to raw::TraitObject
:
pub struct TraitObject {
pub data: *mut (),
pub vtable: *mut (),
}
Using TraitObject
, one can de-construct and re-construct a &T
at leisure.
However, while obtaining the vtable
from de-constructing a &T
is easy, what if I never have the &T
in the first place, but just a T
and S
; essentially, something along the lines of:
fn make_vptr<T: ?Sized, S>() -> *mut ();
How could I divine the v-ptr from there? Is there any intrinsic I could use?
Note: the naive implementation of creating a S
(or conjuring it from thin-air) and then making a &T
reference does not work; the compiler complains that T
is not necessarily a trait
and therefore that &T
is either one pointer or two pointers in size.