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);
}