gpt4 book ai didi

generics - 如何对包含不同类型的链表进行静态调度,所有类型都实现了一个特征?

转载 作者:行者123 更新时间:2023-12-03 11:30:16 24 4
gpt4 key购买 nike

我有这个工作代码:

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;博士 :这是不可能的(至少没有 variadic generics *)

  • 现在Layer结构要求 2通用参数:R'a .
  • 假设我们为 /* ? */ 找到了正确的类型.让我们为它命名 T0 .
  • 然后Layer结构将需要 3通用参数:T0 , R'a .
  • 然后你必须为 parent 提供一个更多的通用参数。 field 。让我们为它命名 T1 .
  • 然后Layer结构将需要 4通用参数:T1 , T0 , R'a .
  • 然后你必须为 parent 提供一个更多的通用参数。 field 。让我们为它命名 T2 .
  • <...>
  • 然后Layer结构将需要 i+2通用参数:Ti , Ti-1 , ... T1 , T0 , R'a .
  • 然后你必须为 parent 提供一个更多的通用参数。 field 。让我们为它命名 Ti+1 .
  • 然后Layer结构将需要 i+1+2通用参数:Ti+1 , Ti , Ti-1 , ... T1 , T0 , R'a .
  • <...>

  • 最后,你有无限递归。 parent 的附加通用参数字段必须定义为 Layer 的一部分结构体。这导致为 Layer 引入一个新的通用参数.这为 parent 引入了额外的通用参数 field 。

    为了分解递归, parent 的附加通用参数不应该是 Layer 的一部分定义。如果参数不是 Layer 的一部分定义那么我们无法计算 Layer编译时的大小。可以解决的方法是 &dynBox .

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

    关于generics - 如何对包含不同类型的链表进行静态调度,所有类型都实现了一个特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60066325/

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