运算符重载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;
}
据我测试,它可以工作。现在我也喜欢添加 -、/、* 运算符,它们的工作方式都相同。当然,我可以使用复制,替换和粘贴。但这不利于可读性和可维护性。有没有更聪明的解决方案,也许是一个概念,因为我不知道这个概念的名称来谷歌它?我刚刚发现,如何重载单个运算符。
您可以使用模板和右值引用&&
(调用时创建的临时 lambda 表达式需要(:
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 行模板和两个单行函数(。
作为学习练习,这很棒,但是...只是不要。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 模板参数替换失败,并且未完成隐式转换
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 如何用转义符替换字符串中的所有特殊字符
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 运算符重载C++、(+、-、*、/ 等)有没有比复制、替换和粘贴更聪明的方法?
- 复制构造函数替换移动构造函数
- 如何将文件复制到另一个文件中,但是用用户输入的单词替换单词
- 用向量替换类新的[]变量-移动、复制运算符
- 用模板复制构造函数替换默认复制构造函数
- 用基类(c++)的复制构造函数替换默认的复制构造函数