我有一些特点(在删除函数和一些参数inflating 后)看起来像:
trait Foo { }
trait Boo { }
trait Bar<T: Foo> { }
trait Baz { }
如果U
实现Bar<T>
用于一些T
实现Foo
and U
实现Boo
,则可以导出Baz
用于U
的实现.然而,我无法编写有效的防 rust 代码来执行此操作.
有几次try 是:
impl<T: Foo, U: Bar<T> + Boo> Baz for U { }
这给了
错误:类型参数
T
不受impl-trait、self-type或谓词[E0207]的约束
鉴于
impl<U: Bar<T> + Boo> Baz for U { }
yields
错误:类型名称
T
未定义或不在范围[E0412]中
在(稳定的) rust 迹中(希望没有任何动态调度)可以/如何做到这一点?
Edit:一些人暗示了一些类似的问题,基本上有两种方法(我发现这两种方法都不适合我的情况):
- 使用关联类型.我不想这样做,因为我想跟踪
T
,例如,我想写一些有签名的函数,比如fn bla<T: Foo, U: Bar<T>, V: Bar<T>>()
,我想知道U
和V
为sameT
实现Bar<T>
.(或者有没有相关类型的方法可以做到这一点?) - 使用某种包装,将
U
和T
放入 struct 中.我也不想使用它,因为我有几层这样的"trait 依赖",所以在每一层中包装东西会让代码inflating 很多.
所以最新的问题是:Is there a solution to this problem without using associated types or wrappers?