问题描述
这确实很难简明解释。但是我想要的是一个结构,该结构具有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()
}
}