如何解决如何将特征对象传递给向量,该向量在向量的向量中也将具有统一的类型?
这确实很难简明解释。但是我想要的是一个结构,该结构具有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()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。