2015-03-05 7 views
7

Esiste un tipo C++ che si comporta come un "array non ridimensionabile di dimensioni dinamiche"? Questo tipo di tipo può essere pensato come una delle due cose:Matrice non ridimensionabile di dimensioni dinamiche

  • vector<T> ma senza resize, push_back, ecc
  • array<T,N> ma dove N è dinamico e non statico.

Non voglio una soluzione che funzioni solo se il tipo di elementi all'interno della matrice è un tipo non copiabile. Voglio una soluzione generica.

+0

Perché avete bisogno di questo? Perché non puoi usare un vettore o un array? – user463035818

+1

Mi piace che i miei tipi siano il più precisi possibile. Ho in programma di usare alcuni 'vector', ma le impostazioni della sua dimensione solo una volta e quindi solo cambiando i suoi valori. Preferisco poter documentare questo tramite il sistema di tipi anziché tramite un commento. – tohava

+0

@Cyber ​​- ma non lo voglio solo per tipi di valori non calcolabili, lo voglio per tutti i tipi. – tohava

risposta

22

Sì, c'è (praticamente) lo è. std::unique_ptr<T[]>. Il modello primario ha una specializzazione parziale per questo caso, che fornisce l'interfaccia appropriata (operatore [], nessun operatore * ecc)

In alternativa, si può avvolgere std::vector nella propria classe e limitare la sua interfaccia. Si potrebbe anche fare questo derivando una classe da std::vector utilizzando l'ereditarietà non pubblica e la pubblicazione solo le parti rilevanti della sua interfaccia:

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

Correggetemi se ho torto, ma questo deve essere un 'const' perché altrimenti qualcuno può sostituire il puntatore. Destra? Un 'const' permette a questo di funzionare davvero come un vettore ridimensionabile di una volta e nient'altro. – tohava

+0

Un trucco molto carino con 'using' – tohava

+0

sembra utilizzare un' const std :: vector <> 'è la soluzione ovvia – Arvid