Je me suis retrouvé à écrire cela juste un peu plus tôt:
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>();
}
Et cela me permet d'écrire des choses comme ceci:
for (auto i: range<0, 10>()) {
// stuff with i
}
Maintenant, je sais ce que j'ai écrit est peut-être pas le meilleur code. Et peut-être il ya un moyen de le rendre plus souple et plus utile. Mais il me semble que quelque chose comme cela aurait dû être fait partie de la norme.
Ainsi en est-il? Était une sorte de nouvelle bibliothèque ajoutée pour les itérateurs sur une plage de nombres entiers, ou peut-être une offre générique de calculé les valeurs scalaires?