簡體   English   中英

盒狀容器 FixedSizeBox<128, dyn SomeTrait> 可以從實現 SomeTrait 的類型構造

[英]Box like container FixedSizeBox<128, dyn SomeTrait> which can be constructed from type implementing SomeTrait

我想實現一個FixedSizeBox ,它的行為類似於Box但擁有 memory ,其中存儲了 object 。 我介紹了一個額外的參數CAPACITY ,它定義了FixedSizeBox將擁有的 memory 的大小。 我遇到的問題是我無法使用dyn SomeTrait作為FixedSizeBox類型並使用特定類型調用new

假設我有一個特征SomeTrait和一個實現該特征的結構A

trait SomeTrait {}
struct A(u8);
impl SomeTrait for A {}

當我想在一個Box中存儲任何實現SomeTrait的 object 時,我可以寫

let mut a: Box<dyn SomeTrait>;
a = Box::new(A { 0: 0 });

對於FixedSizeBox我希望具有相同的功能並像這樣實現它:

pub struct FixedSizeBox<const CAPACITY: usize, T: ?Sized> {
    _marker: PhantomData<T>,
}

impl<const CAPACITY: usize, T> FixedSizeBox<CAPACITY, T> {
    pub fn new(_: T) -> FixedSizeBox<CAPACITY, T> {
        FixedSizeBox::<CAPACITY, T> {
            _marker: PhantomData,
        }
    }
}

當我以與Box相同的方式使用它時,編譯器會失敗:

let mut b: StackBox<128, dyn SomeTrait>;
// assigning a specific type leads to
// mismatched types
// expected struct `StackBox<dyn SomeTrait, 128_usize>`
//    found struct `StackBox<A, {_: usize}>` (rustc E0308)
b = StackBox::new(A { 0: 0 });

我查看了BoxRc的實現,但無法弄清楚 rust 是如何實現這一點的。 是不是缺少什么特質?

作為附帶限制,我想使用穩定的 rust。 我可以弄清楚夜間功能CoerceUnsized

impl<T, U> std::ops::CoerceUnsized<StackBox<U>> for FixedSizeBox<T>
where
    T: std::marker::Unsize<U> + ?Sized,
    U: ?Sized,
{
}

解決了這個問題,但我想了解這是如何在穩定的 rust for Box中實現的,以便我可以將其應用於FixedSizeBox

Box在標准庫中,因此即使在穩定版本上也可以使用夜間功能。 如果沒有 nightly,你就無法做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM