Как вывести 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% случаев.