给定一个包装指针的结构
pub struct Ptr<T> {
ptr: T
}
是否可以声明T
必须是原始指针类型?例如*mut SomeStruct
或*const SomeStruct
。
如果没有这个,我就无法在方法中执行&*self.ptr
之类的操作,因为Rust不知道ptr
可以被视为指针。
请注意,这可以起作用:
pub struct Ptr<T> {
ptr: *mut T
}
但在这种情况下,它会硬编码*mut
,在其他情况下我们可能需要*const
。
请参阅:this answer以提供一些背景信息。
答案 0 :(得分:2)
我不相信这是值得的,但如果你确定那么你可以写一个特性:
pub trait RawPtr: Sized {
type Value;
fn as_const(self) -> *const Self::Value {
self.as_mut() as *const _
}
fn as_mut(self) -> *mut Self::Value {
self.as_const() as *mut _
}
}
impl<T> RawPtr for *const T {
type Value = T;
fn as_const(self) -> Self { self }
}
impl<T> RawPtr for *mut T {
type Value = T;
fn as_mut(self) -> Self { self }
}
在实施功能时,您可以要求P: RawPtr
:
pub struct Ptr<P> {
ptr: P
}
impl<P: RawPtr> Ptr<P> {
unsafe fn get(self) -> P::Value
where P::Value: Copy
{
*self.ptr.as_const()
}
}
此外,可以定义仅在P
是可变指针时才可用的方法:
impl<T> Ptr<*mut T> {
unsafe fn get_mut(&mut self) -> *mut T {
self.ptr
}
}