我定义了一个特征(让我们称之为
MyTrait
)并为任何类型的具有两个元素的元组实现它:
trait MyTrait {
fn my_fn();
}
impl<T1, T2> MyTrait for (T1, T2) {
fn my_fn() {...}
}
但是,我想确保仅当 T1 和 T2 是不同的具体类型时才实现该特征。例如。 (i32, i64) 可以,但 (i32, i32) 不行。这也应该可以扩展到更大的元组(最多 16 个元素)。有办法做到吗?
我尝试通过以下方式使用静态断言:
fn my_fn() {
static OK: () = assert!(std::any::TypeId::of::<T1>() != std::any::TypeId::of::<T2>());
...
}
这会导致错误:
error[E0401]: can't use generic parameters from outer item
我想这是因为 OK 的值将被所有实现共享,无论 T1 和 T2 具体是什么?
我也尝试过思考如何通过特征界限来表达这一点(这似乎是一种更稳健的方法),但找不到方法。
你为什么不简单地这样做呢?
use std::ops::Add;
#[derive(Debug, PartialEq)]
struct Point {
x: i32,
y: i64,
}
impl Add for Point {
type Output = Point;
fn add(self, other: Point) -> Point {
Point {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
fn main() {
assert_eq!(
Point { x: 1, y: 0 } + Point { x: 2, y: 3 },
Point { x: 3, y: 3 }
);
}