簡體   English   中英

如何從盒裝特征 object 中獲取對結構的引用?

[英]How to get reference to struct from boxed trait object?

我想將Box<T>類型的值插入到Vec<Box<Trait>>中,然后獲取對該值的引用。 T是實現Trait的通用類型)。 返回值的類型應該是&T

下面的實現幾乎可以工作,除了無法Box<Trait>轉換為Box<Any>

HashSet有(實驗性的) get_or_insert() ,非常適合這個,但似乎沒有Vec的版本?

use std::any::Any;

trait A {}
struct B;
impl A for B {}

// How to write this function?
pub fn insert<'a, T>(vector: &mut Vec<Box<dyn A>>, value: T) -> &'a T where T: A {
    // move the value into the vector
    vector.push(Box::new(value));

    // get the reference to the inserted value back
    let it: &Box<dyn Any> = vector.last().unwrap(); // compile error
    match it.downcast_ref::<T>() {
        Some(i) => i,
        None => panic!(),
    }
}

fn main() {
    let mut vec: Vec<Box<dyn A>> = Vec::new();
    let b = B;
    let b_ref = insert(&mut vec, b);
    // can't use b here since moved, so need b_ref
}

您可以定義一個為所有類型實現的輔助特征,如下所示:

pub trait AToAny: 'static {
    fn as_any(&self) -> &dyn Any;
}

impl<T: 'static> AToAny for T {
    fn as_any(&self) -> &dyn Any {
        self
    }
}

然后要求它為 A 的子類型實現。

pub trait A: AToAny {
}

您現在可以在從矢量獲得的&dyn A上調用.as_any()

pub fn insert<'a, T: A>(vector: &'a mut Vec<Box<dyn A>>, value: T) -> &'a T {
    vector.push(Box::new(value));

    let it: &dyn Any = vector.last().unwrap().as_any();
    match it.downcast_ref::<T>() {
        Some(i) => i,
        None => panic!(),
    }
}

暫無
暫無

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

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