如何声明一个原始指针的泛型类型?

时间:2016-10-29 09:48:49

标签: rust

给定一个包装指针的结构

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以提供一些背景信息。

1 个答案:

答案 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
    }
}