簡體   English   中英

如何實現可移動重載而不違反C ++中的DRY原理?

[英]how to implement movable overloads without violating the DRY principle in C++?

在我的某些類中實現方法和運算符重載以利用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* ,而只刪除一個operator* ,即:

    matrix_2_2 operator*(const matrix_2_2& m) const;

您的類是一個POD-在這種情況下,移動和復制之間沒有區別,因此,利用移動語義無法獲得任何好處。 您正在獲得代碼復雜性,而不是性能。 真的是你的代碼應該怎么做,如果沒有邏輯區別this&或者&& ...

另外,這:

matrix_2_2 operator*(matrix_2_2&& m) &&
{
    matrix_2_2 res;
    ...
    return std::move(res);
}

這不是正確的寫法,因為最后move使命名返回值優化變得不可能,因此您需要對以下代碼進行額外的move

matrix_2_2 product = some_matrix() * some_other_matrix();

而不是簡單地在product中就地構建res

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM