2015-11-06 55 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

但由于某种原因,它并没有达到标准。我应该何时使用装饰器而不是继承? –