template<class T, class A=std::allocator<T>>
struct magic_vector:std::vector<T,A> {
using base=std::vector<T,A>;
using base::base;
magic_vector(magic_vector const&)=default;
magic_vector(magic_vector &&)=default;
magic_vector& operator=(magic_vector const&)=default;
magic_vector& operator=(magic_vector &&)=default;
magic_vector()=default;
template<class U, class B,
class=typename std::enable_if<std::is_convertible<U,T>::value>::type
>
magic_vector( magic_vector<U,B> const& o ):
base( o.begin(), o.end() )
{}
template<class U, class B,
class=typename std::enable_if<
std::is_convertible<U,T>::value
&& noexcept( T(std::declval<U&&>()) )
>::type
>
magic_vector( magic_vector<U,B>&& o ):
base(
std::make_move_iterator(o.begin()),
std::make_move_iterator(o.end())
)
{}
};
magic_vectors 是从其他magic_vectors 自动转换的向量。
如果您有一个指向 magic_vector 的指针,您将其转换为指向 vector 的指针,然后将其作为 vector 删除,则结果是未定义的行为。 (但在实践中,我检查过的每个 C++ 实现都不会造成伤害)。然而,这是一种奇怪的处理vectors 的方式。
将vector 的使用替换为magic_vector。只要您的代码中容器的确切类型没有专门化,它就应该是一个直接替代品,除非现在它会在它们之间自动转换。
可以让magic_vectors 自动转换为vectors 而不仅仅是magic_vectors。