为所有使用 const 参数实现特征的类型实现特征

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.

范围内的一部分

Playground link

不允许这样做的根本原因是特征边界可能导致同一类型的多个特征实现。

例如,考虑一个实现了 FooConst<1>FooConst<2> 的类型 Bar,这是非常好的:

struct Bar;

impl FooConst<1> for Bar {}
impl FooConst<2> for Bar {}

如果 Foo 为所有 T: FooConst<N> 实现,那么我们得到 两个 FooBar 的实现:一个N == 1 和一个 N == 2。 Rust 不允许有多个特征实现的可能性,这就是为什么它不允许以这种方式使用类型参数。

解决此问题的一种方法是使 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> {}

如果您知道为什么会这样,请随时发表评论。