With implied trait bound (accepted but not implemented), you could do the same but with less line numbers:

```
struct Vec2<X, Y>(pub X, pub Y)
where
X: Add<Output=X> + Mul<Output=X> + Neg<Output=X>,
Y: Add<Output=Y> + Mul<Output=Y> + Neg<Output=Y>;
impl<X, Y> Add for Vec2<X, Y> { ... }
impl<X, Y> Mul for Vec2<X, Y> { ... }
impl<X, Y> Neg for Vec2<X, Y> { ... }
```

Although I need to repeat `impl<X, Y>`

but I don't care much.