Принцип, основанный на диапазоне for
, состоит в том, чтобы выполнять итерацию по всему диапазону.
Однако вы решаете, что такое диапазон, поэтому вы можете работать с самим диапазоном.
template <typename It>
class RangeView {
public:
typedef It iterator;
RangeView(): _begin(), _end() {}
RangeView(iterator begin, iterator end): _begin(begin), _end(end) {}
iterator begin() const { return _begin; }
iterator end() const { return _end; }
private:
iterator _begin;
iterator _end;
};
template <typename C>
RangeView<typename C::iterator> rangeView(C& c, size_t begin, size_t end) {
return RangeView<typename C::iterator>(
std::next(c.begin(), begin),
std::next(c.begin(), end)
);
}
template <typename C>
RangeView<typename C::const_iterator> rangeView(C const& c, size_t begin, size_t end) {
return RangeView<typename C::const_iterator>(
std::next(c.begin(), begin),
std::next(c.begin(), end)
);
}
Хорошо, этот серьезно повторяющийся символ Boost.Range ...
А теперь давайте использовать его!
for (auto i: rangeView(set, 1, 10)) {
// iterate through the second to the ninth element
}