我有一个这样的特征:
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
属于我的板条箱。