2015-11-06 54 views
1

我有bool valarrays的valarray,我需要用我自定義的元素比較函數對它們進行排序。 也就是說如果每個元件的長度是4,然後我希望他們進行排序如下:如何修改STL中的std :: valarray類?

0000, 0001, 0010, 0100, 1000, 0011, 0101, 1001, 0110, 1010, ... 

這裏是我的功能:

inline bool operator<(const std::valarray<bool>& lhs, const std::valarray<bool>& rhs) { 
    if (lhs.soze() != rhs.size()) return 0; 
    if (lhs.sum() < rhs.sum()) return 1; 
    if (lhs.sum() > rhs.sum()) return 0; 
    for (int i = lhs.size() - 1; i >= 0; --i) { 
     if (lhs[i] < rhs[i]) return 0; 
     if (lhs[i] > rhs[i]) return 0; 
    } 
    return 0; 
} 

我想創建具有相同功能的新類,但修改的比較運算符
如果我使用的裝飾,我將不得不指定裝飾類名wheninitializing我的對象:

MyValarray* mv = new MyValarray(new std::valarray<bool>(4)); 

如果我使用繼承我會定義所有的valarray構造。
我希望它是一個獨立的課程。如何以最好的方式做到這一點?

回答

0

這可能會幫助你。 C++ 11引入了繼承構造新的語法:

class MyClass : public std::valarray<bool> { 
    public: 
     using std::valarray<bool>::valarray; 

     // ... 
}; 

你可以使用這個由std::valarray<bool>繼承,而無需編寫構造函數來彌補你的第二個方法。

+0

繼承構造函數是否是一種好習慣? –

+0

@ user162065:如果你不想創建一個全新的類,重複所有的構造函數,並且可能會忘記一些東西,那麼是的,這是一個很好的練習。它由於某種原因進入了標準,不是嗎? )。 – 3442

+0

但由於某種原因,它並沒有達到標準。我應該何時使用裝飾器而不是繼承? –