2012-10-10 9 views
5

Poniższy kod kompiluje grzywny na moim systemie:Iteratory do tablic o różnych rozmiarach

#include <array> 
#include <type_traits> 

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

Czy to zachowanie gwarantowane przez standard? Czy typ iteratora jest niezależny od rozmiaru tablicy?

Jeśli jest to zagwarantowane, czy istnieje sposób na streszczenie z rodzaju elementu i zignorować rozmiar?

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

To znaczy, czy jest jakiś sposób, aby napisać powyższy kod array specyficzne, nie wspominając o wielkości n?

Należy pamiętać, że nie chcę odwoływać się do T*, nawet jeśli w trybie zwolnienia iterator prawdopodobnie jest T*.

+0

Co jest nie tak z 'szablonem void foobar (Itearator_type it)'? – Lol4t0

+1

@ Lol4t0 To zbyt ogólne i nie zaspakaja mojego pragnienia wiedzy? – fredoverflow

+0

Mam na myśli, jeśli kod działa na _given_ iterator, dlaczego miałby narzucać sztuczne ograniczenie? Te 2 komentarze dotyczą tylko ostatniej części twojego pytania, przyczyny. – Lol4t0

Odpowiedz

3

Nie, to nie jest gwarantowane. Każdy typ tablicy array<T, size_t> ma element zagnieżdżony typedef o nazwie iterator, którego typ jest zdefiniowany w implementacji.

1

Prosta odpowiedź sprawia, że ​​jest nieco bardziej ogólny. Dlaczego chcesz zezwalać na iteratory tylko od std::array?

template <typename Iterator> 
void foobar(Iterator it) 

W drugiej części kodu, rozmiar n typu T i są w nie wywnioskować kontekście. Koncepcyjnie kilka std::array typy mogą mieć ten sam typ iterator, lub jak wspomniałeś to może być po prostu T* i byłoby to niemożliwe, aby znaleźć to, co możliwe std::array miał T* jak iterator

+0

W rzeczywistości * faktyczna * odpowiedź jest jeszcze * prostsza *: *" Nie, nie jest to gwarantowane przez standard. "* –

4

Nie, nie ma gwarancji. Średnia po prostu mówi

typedef implementation-defined iterator; 

typu iterator może być zwykły wskaźnik, klasa, która jest członkiem array lub oddzielne klasy owijając zwykły wskaźnik.

Jeśli jest to klasa członka, to będzie zależy od wielkości tablicy. W przeciwnym razie nie.