ฉันพบว่าตัวเองเขียนสิ่งนี้เมื่อไม่นานมานี้:
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>()
ดูเหมือนกันทุกประการ!