运算符重载 C++,(+、-、*、/ 等)有没有比复制、替换和粘贴更聪明的方法?

Operator-overloading C++, (+, -, *, / etc.) Is there a smarter way than copy, replace and paste?

我正在编写一种矩阵库,所以我使用运算符重载为我的矩阵提供了一个 operator +。它看起来像这样。

friend matrix<T, size_x, size_y>  operator + (const matrix<T, size_x, size_y> & Input_1, const matrix<T, size_x, size_y> & Input_2){
    matrix<T, size_x, size_y> Output;
        for (int i=0; i<size_x; i++){
            for (int j=0; j<size_y; j++){
                Output.value[i][j]=Input_1.value[i][j]+Input_2.value[i][j];
            }
        }
    return Output;
}       

据我测试,它是有效的。现在我也想添加 -、/、* 运算符,它们的工作原理都是一样的。当然我可以使用复制、替换和粘贴。但这不利于可读性和可维护性。有没有更聪明的解决方案,或许还有一个概念,因为我不知道这个概念的名称 google 呢?我刚刚发现,如何重载单个运算符。

您可以使用调用时创建的 template and a rvalue reference && (needed for a temporary lambda expression):

template <typename F>
friend matrix<T, size_x, size_y>  doBinOp(F&& f,
                                          const matrix<T, size_x, size_y> & Input_1,
                                          const matrix<T, size_x, size_y> & Input_2)
{
    matrix<T, size_x, size_y> Output;
    for (int i=0; i<size_x; i++) {
        for (int j=0; j<size_y; j++) {
            Output.value[i][j] = f(Input_1.value[i][j], Input_2.value[i][j]);
        }
    }
    return Output;
}

然后

friend matrix<T, size_x, size_y>  operator + (const matrix<T, size_x, size_y> & Input_1,
                                              const matrix<T, size_x, size_y> & Input_2)
{
    return doBinOp([](auto l, auto r) { return l + r; }, Input_1, Input_2);
}

不幸的是,虽然矩阵上的 + 和 - 的工作方式几乎相同,但矩阵的 * 和 / 的工作方式与 + 和 - 完全不同,而且它们之间也不同。

考虑到你只能统一四个实现中的两个实现,我会说保持简单(你用一个 7 行模板和两个一个线性函数替换两个 7 行函数)。

它作为学习练习很棒,但是...只是不要。