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