2015-03-05 10 views
7

Czy istnieje typ C++, który działa jak "dynamicznie wymiarowana, nieodkształcalna tablica"? Ten rodzaj typu mogą być traktowane jako jedna z dwóch rzeczy:Dynamicznie wymiarowana, nieodkształcalna tablica

  • vector<T> ale bez resize, push_back itp
  • array<T,N> ale gdzie N jest dynamiczny, a nie statyczny.

Nie chcę rozwiązania, które działa tylko wtedy, gdy typ elementów w tablicy jest typu niekopiowalnego. Chcę ogólne rozwiązanie.

+0

Dlaczego potrzebne? Dlaczego nie możesz użyć wektora lub tablicy? – user463035818

+1

Lubię moje typy, aby były tak dokładne, jak to możliwe. Planuję użyć jakiegoś 'wektora', ale zmieniam jego rozmiar tylko raz, a następnie zmieniam tylko jego wartości. Wolę, gdybym mógł to udokumentować za pomocą systemu typów zamiast komentarza. – tohava

+0

@Cyber ​​- ale nie chcę tego tylko dla niekodowanych typów wartości, chcę go dla wszystkich typów. – tohava

Odpowiedz

22

Tak, jest (prawie) jest. std::unique_ptr<T[]>. Podstawowym szablon ma częściową specjalizację w tym przypadku, który zapewnia odpowiedni interfejs (operator [], żaden operator * itp)

Alternatywnie, można zawinąć std::vector w swojej własnej klasy i ograniczać jego interfejs. Można nawet zrobić poprzez wyprowadzenie klasę z std::vector użyciem dziedziczenia niepubliczne i publikowanie tylko odpowiednich części jego interfejs:

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

Popraw mnie, jeśli się mylę, ale musi to być 'const', ponieważ w przeciwnym razie ktoś może zastąpić wskaźnik. Dobrze? "Const" pozwala to naprawdę funkcjonować jako jednorazowy resizable wektor i nic więcej. – tohava

+0

Bardzo fajna sztuczka z 'użyciem' – tohava

+0

wydaje się, że użycie' const std :: vector <> 'jest oczywistym rozwiązaniem – Arvid