Eu me peguei escrevendo isso há pouco:
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>();
}
E isso me permite escrever coisas como:
for (auto i: range<0, 10>()) {
// stuff with i
}
Agora, eu sei que o que escrevi talvez não seja o melhor código. E talvez haja uma maneira de torná-lo mais flexível e útil. Mas me parece que algo assim deveria fazer parte do padrão.
Então é isso? Foi adicionado algum tipo de nova biblioteca para iteradores em um intervalo de inteiros ou talvez um intervalo genérico de valores escalares computados?
range
função de modelo? Não acrescenta nada ao uso em que range_class
é usado. Quero dizer, range<0,10>()
e range_class<0,10>()
parecem exatamente iguais!