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

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

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

Во-первых, потому что, если кто-то был так глуп, как 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% случаев.

Другие вопросы по тегам