Tôi thấy mình đã viết điều này chỉ một chút trước đây:
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>();
}
Và điều này cho phép tôi viết những thứ như thế này:
for (auto i: range<0, 10>()) {
// stuff with i
}
Bây giờ, tôi biết những gì tôi đã viết có lẽ không phải là mã tốt nhất. Và có thể có một cách để làm cho nó linh hoạt và hữu ích hơn. Nhưng đối với tôi, có vẻ như những thứ như thế này nên được tạo thành một phần của tiêu chuẩn.
Vậy là nó? Một số loại thư viện mới đã được thêm vào cho các trình vòng lặp trên một phạm vi số nguyên hoặc có thể là một phạm vi chung của các giá trị vô hướng được tính toán?
range
chức năng viết mẫu là gì? Nó không thêm bất cứ điều gì vào việc sử dụng trong đó range_class
được sử dụng. Ý tôi là, range<0,10>()
và range_class<0,10>()
trông giống hệt nhau!