【发布时间】:2015-05-16 14:11:00
【问题描述】:
在我的一些类中实现方法和运算符重载以利用 C++ 中的右值引用时,我经常编写一些设计不佳的代码,违反了 DRY 原则。下面的代码 sn-p 有什么更好的选择? (这段代码只是为了说明问题)
class matrix_2_2
{
int _m[2][2];
public:
matrix_2_2 operator*(const matrix_2_2& m) const &
{
matrix_2_2 res;
for(int i = 0 ; i < 2 ; i ++)
for(int j = 0 ; j < 2 ; j++)
for(int k = 0 ; k < 2 ; k++)
res._m[i][j] = (res._m[i][j] + _m[i][k]*m._m[k][j]);
return res;
}
matrix_2_2 operator*(matrix_2_2&& m) &&
{
matrix_2_2 res;
for(int i = 0 ; i < 2 ; i ++)
for(int j = 0 ; j < 2 ; j++)
for(int k = 0 ; k < 2 ; k++)
res._m[i][j] = (res._m[i][j] + _m[i][k]*m._m[k][j]);
return move(res);
}
这段代码在实现细节中出现了很多重复,我想封装逻辑并在不同的重载中重用它,而不会因为右值到左值的隐式转换而失去可移动的优势。
【问题讨论】:
-
您可以定义第三个函数并让两个
operator*调用它。 -
@Lingxi,在这种情况下我会通过
const matrix_2_2&或matrix_2_2&&?我考虑过这个替代方案,但无法就函数传递的类型得出任何结论。 -
这种情况不需要重载。
标签: c++ c++11 operator-overloading rvalue-reference