gpt4 book ai didi

rust - 在没有额外特征的情况下动态调度泛型结构

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

给定以下设置:

trait MyTrait {}

struct TraitContainer<T: MyTrait> {
inner: T
}

我想创建一个 Vec<TraitContainer<_>>,每个容器可能具有不同的特征实现。天真的方法是删除通用参数,然后将其替换为 Vec<TraitContainer<Box<dyn MyTrait>>>。但是我觉得我不需要。我想做类似 Vec<Box<dyn TraitContainer<MyTrait>>>的事情,感觉这应该可行,但是我真的不知道如何使它工作。

Full playground setup

将我的想法放在另一个上下文中:如果我有一个 Vec<Box<dyn MyTrait>>,则每次我想访问一个对象时,它都会进行动态分配以查找该特征的正确实现。但是,如果我知道我的Vec的所有项目都将具有相同的类型(我只是不知道确切的类型,只是它们实现了某些特征),我应该能够执行 Box<dyn Vec<MyTrait>>。这样,我仍然可以进行动态调度,但可以移到最外层的嵌套级别。

最佳答案

事实证明这很简单:TraitContainer必须标记为未调整大小:

trait MyTrait {}

struct Foo;

impl MyTrait for Foo {}

struct TraitContainer<T: MyTrait + ?Sized>(T); // <--- "+ ?Sized"

impl MyTrait for Box<dyn MyTrait> {
}

fn main() {
let works: TraitContainer<Foo> = TraitContainer(Foo);
let still_works: TraitContainer<Box<dyn MyTrait>> = TraitContainer(Box::new(Foo));
let yay: Box<TraitContainer<dyn MyTrait>> = Box::new(TraitContainer(Foo));
}

需要注意的是,这不适用于其他示例,因为 Vec<T>需要 T: Sized。因此 Box<Vec<dyn MyTrait>>无法编译。

关于rust - 在没有额外特征的情况下动态调度泛型结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61165269/

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