2011-10-28 9 views
5

boost::array (o la versione tr1 o std) offrono alcune funzionalità aggiuntive su un array integrato.È sempre sicuro sostituire un array integrato con un file std/tr1/boost :: array?

Fino ad ora, la nostra base di codice contiene solo gli array built-in, ad esempio (composto, ma lo stile partite):

WORD m_lastReadFlags[FLAGS_MAX]; 
... 
WORD flagBuffer[FLAGS_MAX]; 
if (getFlags(flagBuffer)) { 
    memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags)); 
    ... 

penso one'll l'idea.

Ora, la mia domanda è, per quei luoghi nel codice, in cui far cadere in boost::array avrebbe senso (a causa di altre modifiche apportate), è array un 100% semantica preservare drop-in per il costruito in array? (Possibili errori di compilazione sono OK - cambiamenti di comportamento solo silenziose sono ciò che mi preoccupa.)

Cioè, potrebbe sopra il codice essere riscritta (per esempio) da utilizzare:

boost::array<WORD, FLAGS_MAX> m_lastReadFlags; 

e la memcpy (eventualmente adattata per utilizzare c_array() o data()) e altri accessi in forma di array rimarrebbero gli stessi? Sì, ovviamente potrei anche sostituire il buffer locale con un array e rimuovere lo memcpy o usare std::copy o qualcosa del genere, ma il punto di questa domanda riguarda la compatibilità degli array integrati e della classe dell'array.


Aggiornamento: Una cosa che mi preoccupa è specificamente i luoghi (come nel caso memcpy), dove gli array built-in vengono utilizzati come puntatori. Tutte le occorrenze verranno catturate dal compilatore /gestite correttamente?

E il compito?

T arr1[N]; // or array<T, N> 
T arr2[N]; // or array<T, N> 
T* p1; 
... 
// Note, not all combinations will compile: 
arr1 = arr2; 
p1 = arr1; 
arr2 = p1; 
... 

risposta

5

Sì, che dovrebbe essere soddisfacente, poiché la classe array è appunto un involucro per un array automatico. Ha la stessa sintassi di accesso con parentesi quadre e, se hai bisogno di ottenere il puntatore, sai come farlo. Puoi anche usare std::copy ovunque e utilizzare gli iteratori; è probabile che ciò sarà implementato da memcpy in ogni caso.

La classe array è di tipo di aggregato (senza costruttori non banali/distruttore/assegnazione), in modo da poter inizializzare con l'inizializzatore di aggregazione tradizionali (doppietta), proprio come un array di pianura.

Problemi correlati