gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:29:49 25 4
gpt4 key购买 nike

这真的很难简明扼要地解释。但我想要的是一个结构,它有一个 Vec“A”的字段,其中包含一个线程向量,另一个 Vec“B”在 Vec“A”内。 Vec "A"包含 Vec "B"和线程句柄。 Vec "B"有一个统一的类型,不需要 trait 对象,但 Vec "A"使用 trait 对象持有多种不同类型的 Vec "B"。基本上我不想对 Vec“B”使用特征对象,而是对 Vec“A”使用特征对象。
我试图实现上述,但它并不总是感觉正确和错误。是否有任何实际实现或任何直接解决方法?
我确实尝试过搜索它,但我觉得如果不给谷歌写一段简短的文字,我就无法简明扼要地说出它。
这是我认为应该是什么样子的(伪)代码:

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>>)>,
}
但是,我假设您真正想知道的是如何存储包含非动态项目的动态 Vec 的 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()
}
}

关于generics - 如何将特征对象传递给向量,该向量在向量的向量中也将具有统一类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63431991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com