Как вывести std :: vector? - PullRequest
       17

Как вывести std :: vector?

0 голосов
/ 05 июля 2018

Я хочу класс, полученный из 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?

1 Ответ

0 голосов
/ 05 июля 2018

Обычно это плохая идея.

Во-первых, потому что, если кто-то так же глуп, как new MyVector<int>, а затем сохранит это в std::vector<int> и затем удалит через этот указатель, у вас будет UB. Но это довольно глупый вариант использования; использование new на std::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)
    {
        //...
    }
};

теперь, этот не поддерживает конструкцию из 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% случаев.

...