вообще, необходимость выбора главного элемента в симметричной операции уже не очень приятный знак
Можешь сделать структуру
struct AddT<A, B>(PhantomData<(A, B)>) where A: Add<B;
impl<A, B> Add<A, B> for AddT<A, B> where A: Add<B> { ... }
И потом
fn foo<A, B>() -> <AddT<A, B> as Add<A, B>>::Output where AddT: Add<A, B>