实现std :: ops :: Add以实现特征

时间:2019-08-08 06:46:56

标签: generics rust operator-overloading

我有一个这样的特征:

use std::ops::Add;

pub trait GroupElement: Clone + Sized {
    fn plus(&self, b: &Self) -> Self;
}

#[derive(Debug)]
struct G1 {
    value: i32,
}

#[derive(Debug)]
struct G2 {
    value: i32,
}

impl GroupElement for G1 {
    fn plus(&self, b: &Self) -> Self {
        let value = self.value + b.value;
        G1 { value }
    }
}

impl GroupElement for G2 {
    fn plus(&self, b: &Self) -> Self {
        let value = self.value + b.value;
        G2 { value }
    }
}

现在,如果我想重载+运算符而不进行代码重复,则可以使用宏来实现Add特质

impl Add for $group_element {
    type Output = Self;

    fn add(self, other: Self) -> Self {
        self.plus(&other)
    }
}

但是我想为特征Add实现GroupElement,以便可以通过使用GroupElement运算符在+上使用泛型函数。

impl<T: GroupElement> Add<T> for GroupElement {
    type Output = Self;

    fn add(self, other: T) -> Self {
        self.plus(&other)
    }
}

上面的代码抱怨GroupElement在编译时没有已知的大小(我同意),不同的组将具有不同的大小。

我尝试了以下代码

impl<T: GroupElement> Add<T> for T {
    type Output = T;

    fn add(self, other: T) -> T {
        self.plus(&other)
    }
}

我收到消息type parameter `T` must be used as the type parameter for some local type的错误,该消息似乎不正确,因为GroupElement属于我的板条箱。

我该如何解决? GroupElement的实际实现是here。链接到G1G2

0 个答案:

没有答案