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

时间:2017-08-24 08:08:32

标签: c++ operator-overloading operators

我正在编写一种矩阵库,所以我使用运算符重载给了我的矩阵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;
}       

到目前为止,正如我测试的那样,它有效。现在我也想添加 - ,/,*运算符,它们都是一样的。当然我可以使用复制,替换和粘贴。但这对可读性和可维护性不利。是否有一个更智能的解决方案,也许是一个概念,因为我不知道谷歌的概念名称?我刚刚发现,如何重载单个操作符。

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:0)

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

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

这是一项很好的学习练习,但是......只是不这样做。