generics - 通用数学运算符重载而不进行复制

标签 generics math rust

阅读后this ,我也会有一个关于重载数学运算符的类似问题。

考虑到此代码基础,假设 T对象可以按值添加并给出 O :

use std::ops::Add;

struct NoCopy<T>(T);

impl<T: Add<Output = O>, O> Add for NoCopy<T> {
    type Output = NoCopy<O>;

    fn add(self, other: Self) -> Self::Output {
        NoCopy(self.0 + other.0)
    }
}

fn main() {
    let a = NoCopy::<isize>(5);
    let b = NoCopy::<isize>(3);

    let _c = a + b;
}

我想提供一个 Add 特征的实现来处理 &NoCopy<T>并提供 NoCopy<O>例如,假设为 &T 提供了 Add 运算符(并给出 O )。 T不需要尊重Copy特质。

但我不知道如何编写它,尤其是泛型绑定(bind)。

impl<???> Add for &NoCopy<T> {
    type Output = NoCopy<O>;

    fn add(self, other: Self) -> Self::Output {
        NoCopy(&self.0 + &other.0)
    }
}

缺失的部分( ??? )会是什么样子?

最佳答案

您可以对 &T 设置生命周期约束:

impl<'a, T: 'a, O> Add for &'a NoCopy<T>
where
    &'a T: Add<Output = O>,
{
    type Output = NoCopy<O>;

    fn add(self, other: Self) -> Self::Output {
        NoCopy(&self.0 + &other.0)
    }
}

( playground )

关于generics - 通用数学运算符重载而不进行复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64592298/

相关文章:

c# - 在派生类中通过 .NET 反射调用 protected 泛型方法

python - 图 st 排序或耳朵分解的任何实现?

rust - nightly 的无限制生命周期,需要设计建议

recursion - 为什么我不需要显式借出一个借来的可变变量?

generics - 有没有一种简单的方法可以在 Rust 中使用整型泛型类型?

C# 泛型与 C++ 模板 - 需要澄清约束

java - 将原始 vector 转换为参数化 vector

c++ - 我们如何计算 N choose K modules a prime number 而不会溢出?

java - 如何计算以字符串形式给出的数学表达式?

for-loop - 如何使循环反向排序?