Как продолжение обсуждения темы о паре begin(), end() в связи с появлением в boost диапазона итераторов
boost::iterator_range.
У меня есть свои попытки реализовать нечто подобное (старую версию можно найти
здесьАвтор: sergey_shandar
Дата: 28.08.04
, а новую в CVS на
SourceForge). Так вот, посмотрел на boost::iterator_range, вроде все хорошо. Но, есть некоторые вопросы.
1. Прошу обратить внимание на
boost::end(), на строчку s + sz — 1 if X is Char[sz]. Для меня это немного странно, т.е. получаеться
char A[5];
boost::end(A) == A + 4; /// true???
boost::size(A) == 4; /// true, правильно понял?
int B[5];
boost::end(B) == B + 5; /// true
boost::size(B) == 5; /// true
По моему, это совершенно неправильно. Массивы трогать нельзя, даже ради строк "...", L"...". Если нужны строки заканчивающиеся нулями, то можно испольвать какие нибудь оболочки, например:
char A[] = "Hello world!";
boost::end(make_stringz(A)) == 4;
Интересно ваше мнение.
2. В
boost::iterator_range поля m_Begin и m_End сделаны недоступными из вне. Вопрос: а зачем? По моему, было бы очень даже удобно использовать такие поля, например так:
int A[...];
...
for(boost::iterator_range<int *> R(A); !R.empty(); ++R.m_Bbegin)
{
...
}
Дополнительно: Свой iterator_range я наследовал от std::pair<Iterator, Iterator> (иногда удобно сразу же использовать такую пару без дополнительных конвертаций), поэтому у меня ++R.first, что вобщем смотрится неплохо.
3. Больше вопрос дизайна. По моему, все свойства контейнеров, такие как typename boost::range_iterator<T>::type, typename boost::range_value<T>::type, boost::begin(x), boost::end(X), сами напрашиваються в какое нибудь отдельное пространство имен, типа boost::container, например так:
boost::container::iterator<T>::type;
boost::container::value_type<T>::type;
...
boost::container::begin(x);
boost::container::end(x);
...
К тому же это будет хорошо подходить к той
концепции контейнеров, на которую ссылаются сами авторы boost::range.
PS. А началось все с того что захотелось мне выкинуть свой iterator_range, и заменить на бустовский. Но передумал
, по крайней мере пока.