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
    Ti-1
    <代码>T1
    T0
    R
    'a
  • 然后,您必须为
    parent
    字段提供另一个通用参数。让我们把它命名为
    Ti+1
  • 然后
    结构将需要
    i+1+2
    通用参数:
    Ti+1
    Ti
    Ti-1
    <代码>T1,
    T0
    R
    'a
最后,你有无限的递归。必须将
父项
字段的附加通用参数定义为
结构的一部分。这就为
引入了一个新的通用参数。为
父字段
引入额外的通用参数

要分解递归,父级的附加泛型参数不应该是层定义的一部分。如果参数不是
定义的一部分,则我们无法在编译时计算
大小。解决方法是
&dyn
Box


*另一种可能的解决方案是,但看起来至少在未来几个月甚至几年内,我们都不会有它。

如果您想要异构列表,那么您将不可避免地得到一堆类型参数。以Frunk为例,它成功地实现了这一点,但使编译时间极为缓慢,并且编译期间的内存使用量很大。如果您想要一个异构列表,其类型与另一个列表相同,但其包含的类型不同,那么如果没有动态分派或枚举,您就无法做到这一点。在第一个示例中,您很可能无法在下一个示例中用
&'a
替换
,因为链接列表在代码中是不受欢迎的。它们也不能正确地进行矢量化,并可能导致许多低效率,这将使您的
dyn
vs没有问题。另一个问题是,您为什么决定设计
struct Layer<'a, R: Renderable> {
    parent: Option<&'a Layer<'a, /* ? */>>,
    value: R,
}