Я хочу создать range
-like конструкцию в c++, которая будет использоваться следующим образом:
for (auto i: range(5,9))
cout << i << ' '; // prints 5 6 7 8
for (auto i: range(5.1,9.2))
cout << i << ' '; // prints 5.1 6.1 7.1 8.1 9.1
Обрабатывать регистр целых чисел относительно легко:
template<typename T>
struct range
{
T from, to;
range(T from, T to) : from(from), to(to) {}
struct iterator
{
T current;
T operator*() { return current; }
iterator& operator++()
{
++current;
return *this;
}
bool operator==(const iterator& other) { return current == other.current; }
bool operator!=(const iterator& other) { return current != other.current; }
};
iterator begin() const { return iterator{ from }; }
iterator end() const { return iterator{ to }; }
};
Однако это не работает в случае float
, поскольку стандартный цикл на основе диапазона в C++
проверяет, является ли iter==end
, а не iter <= end
, как вы это сделали бы для цикла.
Есть ли простой способ создать итеративный объект, который будет вести себя как правильный диапазон на основе цикла for на float
?