Generics 如何对包含不同类型的链表进行静态分派,所有这些类型都实现了一个特性?
我有这个工作代码:Generics 如何对包含不同类型的链表进行静态分派,所有这些类型都实现了一个特性?,generics,linked-list,rust,static-dispatch,Generics,Linked List,Rust,Static Dispatch,我有这个工作代码: struct Layer<'a> { parent: Option<Box<Layer<'a>>>, value: Box<dyn Renderable + 'a>, } struct Layer>>, 值:框{ 父项:选项>, 值:R, } 替换问号的类型实现了Renderable,但它不一定是R,例如可以是T:Renderable。我希望避免使用任何使用dyn Renderable的解决方案,
struct Layer<'a> {
parent: Option<Box<Layer<'a>>>,
value: Box<dyn Renderable + 'a>,
}
struct Layer>>,
值:框{
父项:选项>,
值:R,
}
替换问号的类型实现了Renderable
,但它不一定是R
,例如可以是T:Renderable
。我希望避免使用任何使用dyn Renderable
的解决方案,以保持静态调度
类型
T:Renderable
在层
实例化时已知,不会更改。TL;DR:这是不可能的(至少没有*)
- 现在
结构需要层
通用参数:2
和R
'a
- 让我们想象一下,我们为
/*找到了正确的类型*/代码>。让我们把它命名为
T0
- 然后,
结构将需要层
通用参数:3
、T0
和R
'a
- 然后,您必须为
字段提供另一个通用参数。让我们把它命名为parent
T1
- 然后,
结构将需要层
通用参数:4
、T1
、T0
和R
'a
- 然后,您必须为
字段提供另一个通用参数。让我们把它命名为parent
T2
- 然后
结构将需要层
通用参数:i+2
,Ti
<代码>T1,Ti-1
,T0
和R
'a
- 然后,您必须为
字段提供另一个通用参数。让我们把它命名为parent
Ti+1
- 然后
结构将需要层
通用参数:i+1+2
,Ti+1
,Ti
<代码>T1,Ti-1
,T0
和R
'a
父项
字段的附加通用参数定义为层
结构的一部分。这就为层
引入了一个新的通用参数。为父字段
引入额外的通用参数
要分解递归,父级的附加泛型参数不应该是层定义的一部分。如果参数不是层
定义的一部分,则我们无法在编译时计算层
大小。解决方法是&dyn
或Box
*另一种可能的解决方案是,但看起来至少在未来几个月甚至几年内,我们都不会有它。如果您想要异构列表,那么您将不可避免地得到一堆类型参数。以Frunk为例,它成功地实现了这一点,但使编译时间极为缓慢,并且编译期间的内存使用量很大。如果您想要一个异构列表,其类型与另一个列表相同,但其包含的类型不同,那么如果没有动态分派或枚举,您就无法做到这一点。在第一个示例中,您很可能无法在下一个示例中用
&'a
替换,因为链接列表在代码中是不受欢迎的。它们也不能正确地进行矢量化,并可能导致许多低效率,这将使您的dyn
vs没有问题。另一个问题是,您为什么决定设计
struct Layer<'a, R: Renderable> {
parent: Option<&'a Layer<'a, /* ? */>>,
value: R,
}