Per usufruire del gamma-based per-loop è necessario fornire sia begin()
e end()
funzioni membro o sovraccaricare il non membro begin()
e end()
funzioni. In quest'ultimo caso, si può avvolgere la vostra gamma in un std::pair
e sovraccarichi begin()
e end()
per chi:
namespace std {
template <typename T> T* begin(std::pair<T*, T*> const& p)
{ return p.first; }
template <typename T> T* end(std::pair<T*, T*> const& p)
{ return p.second; }
}
Ora è possibile utilizzare il ciclo for in questo modo:
for (auto&& i : std::make_pair(array, array + size))
cout << i << endl;
nota, che le funzioni non membro begin()
e end()
devono essere sovraccaricate nello spazio dei nomi std
qui, poiché lo pair
risiede anche nello spazio nomi std
. Se non hai voglia di manomettere lo spazio dei nomi standard, puoi semplicemente creare la tua piccola classe di coppia e sovraccaricare lo begin()
e lo end()
nel tuo spazio dei nomi.
Oppure, creare un sottile involucro intorno al vostro array allocato in modo dinamico e fornire begin()
e end()
membri funzioni:
template <typename T>
struct wrapped_array {
wrapped_array(T* first, T* last) : begin_ {first}, end_ {last} {}
wrapped_array(T* first, std::ptrdiff_t size)
: wrapped_array {first, first + size} {}
T* begin() const noexcept { return begin_; }
T* end() const noexcept { return end_; }
T* begin_;
T* end_;
};
template <typename T>
wrapped_array<T> wrap_array(T* first, std::ptrdiff_t size) noexcept
{ return {first, size}; }
e il vostro sito chiamata simile a questo:
for (auto&& i : wrap_array(array, size))
std::cout << i << std::endl;
Example
fonte
2013-04-10 07:42:14
cosa gli errori dicono? Almeno post ** uno ** errore – Default
si chiama range-based per loop e SO e Google hanno tonnellate di esempi – stijn
[Errore] C: \ Users \ Siegfred \ Documents \ C-Free \ Temp \ Untitled2.cpp: 16: 16: errore: nessuna funzione di corrispondenza per la chiamata a 'begin (int * &)' –