jer*_*roe 7 generics struct types rust
我正在尝试创建一个包含一个isize
或一个的通用结构AtomicIsize
,但是当我尝试为结构的两个可能实现实现一个特性时,我遇到了一个错误.我创建了一个最小的例子来演示我的问题.
use std::sync::atomic::{AtomicIsize, Ordering};
use std::ops::Deref;
use std::marker::PhantomData;
pub trait Counted {
fn inc(&self, value: isize);
}
pub type PlainCounter = isize;
pub type AtomicCounter = AtomicIsize;
pub struct Counter<'a, T: 'a> {
counter: T,
phantom: PhantomData<&'a T>,
}
impl<'a, T> Counter<'a, T>
where T: Deref<Target = PlainCounter>
{
pub fn new(counter: T) -> Self {
Counter {
counter: counter,
phantom: PhantomData,
}
}
}
impl<'a, T> Counted for Counter<'a, T>
where T: Deref<Target = PlainCounter>
{
fn inc(&self, value: isize) {
self.counter += 1;
}
}
impl<'a, T> Counter<'a, T>
where T: Deref<Target = AtomicCounter>
{
pub fn new(counter: T) -> Self {
Counter {
counter: counter,
phantom: PhantomData,
}
}
}
impl<'a, T> Counted for Counter<'a, T>
where T: Deref<Target = AtomicCounter>
{
fn inc(&self, value: isize) {
self.counter.fetch_add(value, Ordering::SeqCst);
}
}
Run Code Online (Sandbox Code Playgroud)
(游乐场)
我得到的错误是编译器找到的conflicting implementations of trait `Counted` for type `Counter<'_, _>`
.似乎编译器无法确定实现是针对两种不同的类型T
,即T: Deref<Target = PlainCounter>
和T: Deref<Target = AtomicCounter>
.是否有一种方法可以为编译器提供额外的信息,以便它可以区分这两种情况,还是我完全错误的路径?
您可以通过定义第二个特征来完成此模式,该特征可以完成实际的工作,并针对实现了(Counter<'a, T>, <T as Deref>::Target)
该Counter
特征,并将该特征调出该实现。
我认为这不是很清楚,但是我认为一个例子可以很好地说明这一点。为了清楚起见,使用Shepmaster的简短示例,我们可以从以下内容开始:
use std::ops::Deref;
trait Foo {}
impl<T> Foo for T
where T: Deref<Target = u8>
{}
impl<T> Foo for T
where T: Deref<Target = bool>
{}
fn main() {}
Run Code Online (Sandbox Code Playgroud)
对此:
use std::ops::Deref;
trait Foo {}
trait InnerFoo {}
impl<T> Foo for T
where T: Deref,
(T, <T as Deref>::Target): InnerFoo
{}
impl<T> InnerFoo for (T, u8)
{}
impl<T> InnerFoo for (T, bool)
{}
fn main() {}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这还没有在语言中实现。
有这个跟踪问题:rust-lang/rust#20400。
RFC rust-lang/rfcs#1672也被提出来解决这个问题,但随后被推迟,等待Chalk 集成,这将使其更容易实现。
同时,您必须使用上面建议的解决方法。
归档时间: |
|
查看次数: |
206 次 |
最近记录: |