【问题标题】:Operator-overloading C++, (+, -, *, / etc.) Is there a smarter way than copy, replace and paste?运算符重载 C++, (+, -, *, / etc.) 有没有比复制、替换和粘贴更聪明的方法?
【发布时间】:2017-08-24 08:08:31
【问题描述】:

我正在编写一种矩阵库,所以我给我的矩阵一个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;
}       

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

【问题讨论】:

  • 您需要一个嵌套 for 循环,并为 +、-、* 和 / 中的每一个提供回调函数(尽管矩阵乘法听起来与 + 和 - 不同的嵌套循环)。但是你仍然需要分离重载。考虑到代码行数、编译时间和运行时间优化(如果有的话),我强烈建议复制粘贴和修改。
  • 我会更加小心 * 和 / '工作相同',因为没有人会期待。矩阵乘法不是这样工作的。
  • @Ken Cheung。谢谢你。你给了我一个新的研究点。问候马库斯
  • 至少在我的矩阵库中我只是复制意大利面。调试更容易,维护更清晰。它也是一个 std::array,所以像上面这样的函数你可能会丢失内部循环。
  • @UKMonkey。实际上,它不是矩阵。它只是一种矩阵。它是一个 pde-grid 或离散化的二维函数。

标签: c++ operator-overloading operators


【解决方案1】:

您可以使用templatervalue reference &amp;&amp;(调用时创建的临时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);
}

【讨论】:

  • 我不熟悉 lambda 表达式和右值引用 &&。多亏了你,我现在就努力学习。
  • 这里说转发引用似乎更合适,因为这个引用也有绑定左值的能力。
【解决方案2】:

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

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

这是一个很好的学习练习,但是……不要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2020-08-28
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多