Простым решением будет инкапсуляция вектора внутри вашего собственного контейнера ограниченного размера. Вы можете использовать частную композицию или частное наследование - отметьте, что модели частного наследования реализованы в терминах и не имеют некоторых недостатков публичного наследования.
РЕДАКТИРОВАТЬ : эскиз решения с частным наследованием
template <typename T, unsigned int N>
class fixed_vector : std::vector<T>
{
typedef std::vector<T> vector_type;
public:
typedef typename vector_type::reference reference;
typedef typename vector_type::const_reference const_reference;
typedef typename vector_type::iterator iterator;
typedef typename vector_type::const_iterator const_iterator;
typedef typename vector_type::value_type value_type;
typedef typename vector_type::size_type size_type;
fixed_vector() : vector_type() {}
fixed_vector( size_type size, value_type const & value = value_type() )
: vector_type(size,value)
{}
void push_back( value_type v ) {
ensure_can_grow();
vector_type::push_back( v );
}
iterator insert( iterator position, value_type const & v ) {
ensure_can_grow();
vector_type::insert( position, v );
}
void reserve( size_type size ) {
if ( size > N ) throw std::invalid_argument();
vector_type::reserve( size );
}
size_type capacity() const {
// In case the default implementation acquires by default
// more than N elements, or the vector grows to a higher capacity
return std::min( vector_type::capacity(), N );
}
// provide other insert methods if required, with the same pattern
using vector_type::begin;
using vector_type::end;
using vector_type::operator[];
using vector_type::erase;
using vector_type::size;
using vector_type::empty;
private:
void ensure_can_grow() const {
// probably a different exception would make sense here:
if ( this->size() == N ) throw std::bad_alloc();
}
};
Там довольно много размахивают руками ... std::vector
Принимайте больше аргументов, которые можно добавить к фасаду. Если вам нужны какие-либо другие методы или typedef, вы можете просто перенести их в область действия с помощью объявления using
, переопределить typedef или внедрить адаптер с вашим конкретным тестом.
Кроме того, в этой реализации размер является постоянной времени компиляции, но было бы действительно просто изменить ее в параметр конструктора.