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

Joe*_*yBF 3 generics traits rust const-generics

我相信下面的代码是有意义的:

trait FooConst<const N: usize> {}
trait Foo {}

impl<T: FooConst<N>, const N: usize> Foo for T {}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译它时,出现错误 E0207,指出该参数N是无界的。我不明白为什么,因为在我看来,这是绑定的一部分T

游乐场链接

Frx*_*rem 8

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

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

struct Bar;

impl FooConst<1> for Bar {}
impl FooConst<2> for Bar {}
Run Code Online (Sandbox Code Playgroud)

如果Foo为 all 实现T: FooConst<N>,那么我们会得到两种 Foo实现Bar:一种为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   
}
Run Code Online (Sandbox Code Playgroud)