![](/img/trans.png)
[英]How can I clone a Vec<Box<dyn SomeTrait>> on an object?
[英]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 });
我查看了Box
和Rc
的實現,但無法弄清楚 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.