[英]Implementing a trait for all types implementing a trait with const parameter
我相信以下代码是有道理的:
trait FooConst<const N: usize> {}
trait Foo {}
impl<T: FooConst<N>, const N: usize> Foo for T {}
但是,当我尝试编译它时,我收到错误 E0207,指出参数N
是无界的。 我不明白为什么,因为在我看来它是T
绑定的一部分。
不允许这样做的根本原因是因为 trait bound 可能会导致同一类型的多个 trait 实现。
例如,考虑一个同时实现FooConst<1>
和FooConst<2>
Bar
类型,这是非常好的:
struct Bar;
impl FooConst<1> for bar {}
impl FooConst<2> for bar {}
如果Foo
对所有实现T: FooConst<N>
那么我们得到两个Foo
为实现Bar
:一个用于N == 1
,一个用于N == 2
。 Rust 不允许有多个 trait 实现,这就是为什么它不允许以这种方式使用类型参数。
解决此问题的一种方法是将N
设为关联常量:
trait FooConst {
const N: usize;
}
trait Foo {}
impl<T: FooConst> Foo for T {
// T::N is an associated constant
}
好的,所以我不完全知道为什么这会在您的代码不起作用时起作用,但是这里有一个代码可以满足您的要求:
trait FooConst<const N: usize> {}
trait Foo {}
impl<const N: usize> Foo for dyn FooConst<N> {}
如果您知道为什么会这样,请随时发表评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.