Я поймал себя на том, что написал это совсем недавно:
template <long int T_begin, long int T_end>
class range_class {
public:
class iterator {
friend class range_class;
public:
long int operator *() const { return i_; }
const iterator &operator ++() { ++i_; return *this; }
iterator operator ++(int) { iterator copy(*this); ++i_; return copy; }
bool operator ==(const iterator &other) const { return i_ == other.i_; }
bool operator !=(const iterator &other) const { return i_ != other.i_; }
protected:
iterator(long int start) : i_ (start) { }
private:
unsigned long i_;
};
iterator begin() const { return iterator(T_begin); }
iterator end() const { return iterator(T_end); }
};
template <long int T_begin, long int T_end>
const range_class<T_begin, T_end>
range()
{
return range_class<T_begin, T_end>();
}
И это позволяет мне писать такие вещи:
for (auto i: range<0, 10>()) {
// stuff with i
}
Теперь я знаю, что то, что я написал, возможно, не самый лучший код. И, возможно, есть способ сделать его более гибким и полезным. Но мне кажется, что нечто подобное следовало бы сделать частью стандарта.
Так ли это? Была ли добавлена какая-то новая библиотека для итераторов в диапазоне целых чисел или, может быть, общий диапазон вычисляемых скалярных значений?
range
? Это ничего не добавляет к использованию, в котором используетсяrange_class
. Я имею в виду, чтоrange<0,10>()
иrange_class<0,10>()
выглядят совершенно одинаково! - person Nawaz   schedule 25.08.2011for
. - person Gene Bushuyev   schedule 30.08.2011for
, и алгоритмfor_each
идеально подходят для нужд разработчика. На самом деле я не думаю, что оператор for, основанный на диапазоне, был хорошей идеей привнести в язык, поскольку он создает нечестивую зависимость языковых функций от библиотеки, неудивительно, что сразу же возникли проблемы с файлами заголовков и ADL. - person Gene Bushuyev   schedule 31.08.2011