Saya mendapati diri saya menulis ini beberapa saat yang lalu:
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>();
}
Dan ini memungkinkan saya untuk menulis hal-hal seperti ini:
for (auto i: range<0, 10>()) {
// stuff with i
}
Sekarang, saya tahu apa yang saya tulis mungkin bukan kode terbaik. Dan mungkin ada cara untuk membuatnya lebih fleksibel dan berguna. Tapi bagi saya sepertinya sesuatu seperti ini seharusnya dijadikan bagian dari standar.
Jadi begitu? Apakah semacam pustaka baru ditambahkan untuk iterator melalui rentang bilangan bulat, atau mungkin rentang umum nilai skalar yang dihitung?
range
fungsi template? Itu tidak menambahkan apa pun ke penggunaan yang range_class
digunakan. Maksudku, range<0,10>()
dan range_class<0,10>()
terlihat persis sama!