2012-10-10 19 views
5

Il seguente codice compila bene sul mio sistema:Iteratori per gli array di dimensioni diverse

#include <array> 
#include <type_traits> 

static_assert(std::is_same<std::array<int, 5>::iterator, 
          std::array<int, 7>::iterator>::value, ":("); 

è che il comportamento garantito dalla norma? Il tipo iteratore è indipendente dalla dimensione dell'array?

Se è garantito, esiste un modo per astrarre dal tipo di elemento e ignorare la dimensione?

template<typename T, size_t n> 
void foobar(std::array<T, n>::iterator it) 

Cioè, esiste un modo per scrivere il codice specifico matrice sopra senza menzionare la dimensione n?

Si noti che non voglio ricorrere a T*, anche se in modalità di rilascio l'iteratore probabilmente è un T*.

+0

Cosa c'è di sbagliato con 'template void foobar (Itearator_type it)'? – Lol4t0

+1

@ Lol4t0 È troppo generico e non soddisfa la mia sete di conoscenza? – fredoverflow

+0

Voglio dire, se il codice funziona per _given_ iterator, perché si dovrebbe imporre una limitazione artificiale? Questo 2 commenti collegati solo l'ultima sezione della tua domanda, di causa. – Lol4t0

risposta

3

No, non è garantito. Ogni tipo di array array<T, size_t> ha un typedf nidificato denominato iterator il cui tipo è definito dall'implementazione.

1

La semplice risposta è renderla un po 'più generica. Perché vuoi solo consentire gli iteratori da un std::array?

template <typename Iterator> 
void foobar(Iterator it) 

Nella seconda parte del codice, il tipo e le dimensioni Tn sono in un contesto non deducibile. Concettualmente più std::array tipi potrebbero avere lo stesso iterator tipo, o come si parla può essere solo T*, e sarebbe impossibile trovare quale possibile std::array avuto un T* come iterator

+0

Infatti la * actual * answer è anche * più semplice *: *" No, questo non è garantito dallo standard. "* –

4

No, non ci sono garanzie. Lo standard dice solo

typedef implementation-defined iterator; 

Il tipo iteratore potrebbe essere un puntatore normale, una classe che è un membro del array, o di una classe separata avvolgendo il puntatore pianura.

Se si tratta di una classe membro, lo sarà dipende dalla dimensione dell'array. Altrimenti probabilmente no.

Problemi correlati