如何对包含不同类型都实现特征的链表进行静态调度?



我有这个工作代码:

struct Layer<'a> {
parent: Option<Box<Layer<'a>>>,
value: Box<dyn Renderable + 'a>,
}

我想有一个使用静态调度的版本:

struct Layer<'a, R: Renderable> {
parent: Option<&'a Layer<'a, /* ? */>>,
value: R,
}

替换问号的类型实现了Renderable,但它不一定是R,例如它可以T: Renderable。我想避免使用dyn Renderable的任何解决方案,以保持静态调度。

T: Renderable类型在实例化时是已知的Layer并且不会更改。

TL;DR:这是不可能的(至少没有可变参数泛型*(

  • 目前Layer结构需要2通用参数:R'a

  • 假设我们找到了适合/* ? */的类型。让我们将其命名为T0.

  • 然后Layer结构将需要3泛型参数:T0R'a

  • 然后,您必须为parent字段再提供一个通用参数。让我们将其命名为T1.

  • 然后Layer结构将需要4泛型参数:T1T0R'a

  • 然后,您必须为parent字段再提供一个通用参数。让我们将其命名为T2.

  • <...>

  • 然后Layer结构将需要i+2泛型参数:TiTi-1、...T1T0R'a
  • 然后,您必须为parent字段再提供一个通用参数。让我们将其命名为Ti+1.
  • 然后Layer结构将需要i+1+2泛型参数:Ti+1TiTi-1、...T1T0R'a
  • <...>

最后,你有无限递归。parent字段的其他泛型参数必须定义为Layer结构的一部分。这导致为Layer引入新的通用参数。这会为parent字段引入其他泛型参数。

为了分解递归,parent的其他泛型参数不应是Layer定义的一部分。如果参数不是Layer定义的一部分,那么我们无法在编译时计算Layer大小。解决方式是&dynBox

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

相关内容

  • 没有找到相关文章

最新更新