Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符重载C++;,(+;,-,*,/等)有没有比复制、替换和粘贴更聪明的方法?_C++_Operator Overloading_Operators - Fatal编程技术网

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

C++ 运算符重载C++;,(+;,-,*,/等)有没有比复制、替换和粘贴更聪明的方法?,c++,operator-overloading,operators,C++,Operator Overloading,Operators,我正在编写一种矩阵库,因此我使用操作符重载为我的矩阵提供了一个操作符+。看起来像这样 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;

我正在编写一种矩阵库,因此我使用操作符重载为我的矩阵提供了一个
操作符+
。看起来像这样

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;
}       
友元矩阵运算符+(常数矩阵和输入_1,常数矩阵和输入_2){
矩阵输出;
对于(int i=0;i您可以使用a和a(调用时创建的临时文件所需):

模板
友元矩阵doBinOp(F&&F,
常数矩阵和输入_1,
常数矩阵和输入(2)
{
矩阵输出;

对于(int i=0;i不幸的是,虽然+和-on矩阵的工作原理几乎相同,但*和/of矩阵的工作原理与+和-完全不同,它们之间的工作原理也不同

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


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

您需要一个嵌套for循环,每个循环都有回调函数+、-、*,和/(尽管矩阵乘法听起来与+和-)的嵌套循环不同)。但您仍然需要分离重载。考虑到代码行数,编译时和运行时优化(如果有)我强烈推荐复制、粘贴和修改。我会更加小心地使用*和/“相同的方式”,因为没有人会想到。矩阵乘法不是那样工作的。@Ken Cheung。谢谢。你给了我一个新的研究重点。你好,Markus至少在我的矩阵库中,我只是复制意大利面。这更容易一步一步地完成调试和更清晰的维护。它也是一个std::array,所以像上面这样的函数可能会丢失内部循环。@UKMonkey。实际上,它不是一个矩阵。它只是一种矩阵。它是一个pde网格或离散的2d函数。我不熟悉lambda表达式和右值引用&。多亏了你,我现在将尝试学习它。它是ems更适合在这里谈论转发引用,因为此引用还具有绑定到左值的能力。
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);
}