[英]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.