0

std::vector我想要一个为我的操作员派生的类[]

template<class T>
class MyVector : public std::vector<T>
{
public:
    // ?...

    const T &operator[](size_t index) const
        {
            //...
        }

    T &operator[](size_t index)
        {
            //...
        }
};

int main()
{
    MyVector<int> myVec = { 1, 2, 3 };
    //...
}

如何std::vector为 C++11 派生所有构造函数和分配运算符?

4

1 回答 1

2

通常这是一个坏主意。

首先,因为如果有人傻到new MyVector<int>然后将其存储在 a 中std::vector<int>,然后通过该指针删除,那么您就有了 UB。但这是一个非常愚蠢的用例。使用newonstd::vector真的很糟糕的代码气味。

其次,因为它看起来毫无意义且令人困惑。

但你可以做到。

template<class T>
class MyVector : public std::vector<T>
{
public:
  using std::vector<T>::vector;
  using std::vector<T>::operator=;
  MyVector(MyVector const&)=default;
  MyVector(MyVector &&)=default;
  MyVector& operator=(MyVector const&)=default;
  MyVector& operator=(MyVector &&)=default;
  const T &operator[](size_t index) const
    {
        //...
    }

T &operator[](size_t index)
    {
        //...
    }
};

现在,这支持 construct-from std::vector<T>

MyVector( std::vector<T>&& o ):std::vector<T>(std::move(o)) {}
MyVector( std::vector<T> const& o ):std::vector<T>(o) {}
MyVector& operator=( std::vector<T>&& o ) {
  static_cast<std::vector<T&>>(*this) = std::move(o);
  return *this;
}
MyVector& operator=( std::vector<T> const& o ) {
  static_cast<std::vector<T&>>(*this) = o;
  return *this;
}

这涵盖了最后一些情况。

这不会完全透明,但它涵盖了 99.9% 的案例。

于 2018-07-05T18:06:46.813 回答