2015-03-05 3 views
7

Существует ли тип C++, который действует как «динамический размер не изменяемого размера массива»? Такой тип можно рассматривать как одну из двух вещей:Динамический размер не изменяемого размера массива

  • vector<T> но без resize, push_back и т.д.
  • array<T,N> но где N является динамическим, а не статическим.

Я не хочу решение, которое работает только в том случае, если тип элементов в массиве не является копируемым. Я хочу получить общее решение.

+0

Зачем вам это нужно? Почему вы не можете использовать вектор или массив? – user463035818

+1

Мне нравятся мои типы, чтобы быть как можно точнее. Я планирую использовать некоторый «вектор», но устанавливает его размер только один раз, а затем меняет его значения. Я предпочитаю, если бы я мог документировать это через систему типов, а не через комментарий. – tohava

+0

@Cyber ​​- но я не хочу его использовать только для типов noncopyable value, я хочу его для всех типов. – tohava

ответ

22

Да, там (в значительной степени) есть. std::unique_ptr<T[]>. Первичный шаблон имеет частичную специализацию для этого случая, который обеспечивает соответствующий интерфейс (оператор [], нет оператора * и т.д.)

В качестве альтернативы, вы можете обернуть std::vector в собственном классе и ограничить его интерфейс. Можно даже сделать это путем вывода класса из std::vector с помощью наследования непубличной и публикации только соответствующие части его интерфейса:

template <class T, class A = std::allocator<T>> 
struct FixedVector : private std::vector<T, A> 
{ 
    using FixedVector::vector::vector; 
    using FixedVector::vector::operator=; 
    using FixedVector::vector::get_allocator; 
    using FixedVector::vector::at; 
    using FixedVector::vector::front; 
    using FixedVector::vector::back; 
    using FixedVector::vector::data; 
    using FixedVector::vector::begin; 
    using FixedVector::vector::cbegin 
    using FixedVector::vector::end; 
    using FixedVector::vector::cend; 
    using FixedVector::vector::empty; 
    using FixedVector::vector::size; 
    using FixedVector::vector::operator[]; 
}; 
+2

Исправьте меня, если я ошибаюсь, но это должно быть 'const', потому что иначе кто-то может заменить указатель. Правильно? «Const» позволяет это действительно функционировать как одноразовый изменяемый вектор и ничто другое. – tohava

+0

Очень хороший трюк с 'using' – tohava

+0

выглядит как' const std :: vector <> 'является очевидным решением – Arvid

Смежные вопросы