如何将特征对象传递给向量,该向量在向量的向量中也将具有统一的类型?

问题描述

这确实很难简明解释。但是我想要的是一个结构,该结构具有Vec“ A”字段,该字段包含线程向量,而Vec“ A”内包含另一个Vec“ B”。 Vec“ A”同时容纳Vec“ B”和螺纹手柄。 Vec“ B”具有统一类型,不需要特征对象,但是Vec“ A”使用特征对象保存多种不同类型的Vec“ B”。基本上,我不想将特征对象用于Vec“ B”,而将特征对象用于Vec“ A”。

我尝试实现上述功能,但并不总是感觉正确和错误。是否对此有任何实际的实现或任何直接的解决方法

我确实尝试过搜索它,但是我觉得如果不给Google写一段简短的文字就无法简明扼要地表达它。

这是我认为应为的(伪)代码

trait Tag {}

impl Tag for u32 {}
impl Tag for i64 {}


// Vec "B"
type InnerVec<T: Tag> = Vec<T>;

struct ThreadPool {
    // Vec "A"
    threads: Vec<(JoinHandle<()>,InnerVec<dyn Tag>)>,}

解决方法

因此,首先,类型别名不是新类型。它更像是一个查找和替换系统,用于处理长类型名称(例如:type Foo<T> = FooSys<T,Vec<T>,u32>;)。我怀疑它是否会允许您添加其他类型约束。

关于您的问题,对伪代码最直接的工作解释是为ThreadPool添加有效期。

trait Tag {}

impl Tag for u32 {}
impl Tag for i64 {}


struct ThreadPool<'a> {
    threads: Vec<(JoinHandle<()>,Vec<Box<dyn Tag + 'a>>)>,}

但是,我认为您真正想知道的是如何存储包含非动态项目的动态Vecs的Vec。为此,您可以使用Any并将其向下转换为所需的类型。您可以在docs中找到更多信息。

use std::any::Any;

struct ThreadPool {
    threads: Vec<(JoinHandle<()>,Box<dyn Any>)>,}

impl ThreadPool {
    pub fn get_tags<T: 'static>(&self,index: usize) -> Option<&Vec<T>> {
        let (_,ref boxed) = self.threads[index];
        boxed.downcast_ref()
    }
}