Если вы знаете размер во время компиляции, возможно, лучше использовать std :: tr1 :: array (или boost :: array ). Он сохраняет фиксированный размер и проверяет доступ как std :: vector.
Если, однако, вы знаете это только во время выполнения, как уже было сказано другими, вы должны инкапсулировать свой вектор в классе с помощью специальных функций, которые будут проверять необходимые условия (например, с помощью утверждений).
В этом последнем подходе я бы предложил, если вы знаете максимальный размер при создании вектора, зарезервировать (std :: vector :: reserve ()) максимальный размер вектора в конструкторе инкапсулирующего класса (или функция инициализации). Таким образом, больше не будет манипуляций с памятью самим вектором (только если конструктор / деструктор векторных элементов выполняет такие манипуляции). Затем, добавив простое утверждение, проверяющее, что емкость вектора (std :: vector ::acity ()) никогда не менялась в начале и в конце всех функций вашего класса, поможет вам убедиться, что память не перемещается.
Например (при условии, что DATA_MAX_SIZE - это максимальный размер по умолчанию, определенный где-то):
template< typename MyType >
class MyData
{
public:
MyData( unsigned long max_size = DATA_MAX_SIZE )
: m_max_size( max_size )
{ m_data.reserve( m_max_size ); }
void add( const MyType& value ) { check_capacity(); m_data.push_back( value ); check_capacity(); }
private:
std::vector< MyType > m_data;
const unsigned long m_max_size;
void check_capacity() { if( m_data.capacity() != m_max_size ) throw Exception("Useful error message here!" ); }
};
Или что-то в этом роде ...