Должен ли я просто специализировать begin () и end ()?
blockquote>Насколько мне известно, этого достаточно. Вы также должны убедиться, что приращение указателя будет начинаться с начала до конца.
Следующий пример (отсутствует версия const begin и end) компилируется и работает нормально.
#include <iostream> #include <algorithm> int i=0; struct A { A() { std::generate(&v[0], &v[10], [&i](){ return ++i;} ); } int * begin() { return &v[0]; } int * end() { return &v[10]; } int v[10]; }; int main() { A a; for( auto it : a ) { std::cout << it << std::endl; } }
Вот еще один пример с функциями begin / end as. Они должны находиться в том же пространстве имен, что и класс, из-за ADL:
#include <iostream> #include <algorithm> namespace foo{ int i=0; struct A { A() { std::generate(&v[0], &v[10], [&i](){ return ++i;} ); } int v[10]; }; int *begin( A &v ) { return &v.v[0]; } int *end( A &v ) { return &v.v[10]; } } // namespace foo int main() { foo::A a; for( auto it : a ) { std::cout << it << std::endl; } }