C++ 实现 Python 风格的 range for

2021-04-14  本文已影响0人  奇点创客

不支持 step 为负数的情况

#include <concepts>
#include <iostream>

template<std::integral I = int>
class range_iterator
{
public:
    range_iterator(I value, I step) : value_{ value }, step_{ step } {}
    range_iterator& operator++() { value_ += step_; return *this; }
    bool operator!= (const range_iterator& other) { return value_ < other.value_; }
    I& operator*() { return value_; }
private:
    I value_, step_;
};

template<std::integral I = int>
class range
{
public:
    explicit range(I stop) : start_{ 0 }, stop_{ stop }, step_{ 1 } {}
    range(I start, I stop, I step = 1) : start_{ start }, stop_{ stop }, step_{ step } {}
    range_iterator<I> begin() { return range_iterator<I>(start_, step_); }
    range_iterator<I> end() { return range_iterator<I>(stop_, step_); }
private:
    I start_, stop_, step_;
};


int main()
{
    for (auto i : range(10))
        std::cout << i << " ";
    std::cout << std::endl;

    for (auto i : range(1, 10))
        std::cout << i << " ";
    std::cout << std::endl;

    for (auto i : range(1, 100, 5))
        std::cout << i << " ";
    std::cout << std::endl;
}

上一篇 下一篇

猜你喜欢

热点阅读