通常这是一个坏主意。
首先,因为如果有人傻到new MyVector<int>
然后将其存储在 a 中std::vector<int>
,然后通过该指针删除,那么您就有了 UB。但这是一个非常愚蠢的用例。使用new
onstd::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% 的案例。