在我的一些類中實現方法和運算符重載以利用C++中的右值引用時,通常會編寫一些違反DRY原則的糟糕設計的代碼。下面的代碼片段會是更好的替代方案嗎? (此代碼只是爲了說明問題)如何在不違反C++ DRY原則的情況下實現可移動重載?
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 &&'?我想到了這種替代方案,但無法就傳遞函數的類型得出任何結論。 – LunaticSoul
對於這種情況,您不需要重載。 –