Preparation for std::iterator Being Deprecated

前端 未结 2 1704
遇见更好的自我
遇见更好的自我 2020-11-27 11:08

On March 21st the standards committee voted to approve the deprecation of std::iterator proposed in P0174:

The long sequence of void argume

2条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-27 11:57

    The discussed alternatives are clear but I feel that a code example is needed.

    Given that there will not be a language substitute and without relying on boost or on your own version of iterator base class, the following code that uses std::iterator will be fixed to the code underneath.

    With std::iterator

    template
    class Range {
    public:
        // member typedefs provided through inheriting from std::iterator
        class iterator: public std::iterator<
                            std::forward_iterator_tag, // iterator_category
                            long,                      // value_type
                            long,                      // difference_type
                            const long*,               // pointer
                            const long&                // reference
                                          >{
            long num = FROM;
        public:
            iterator(long _num = 0) : num(_num) {}
            iterator& operator++() {num = TO >= FROM ? num + 1: num - 1; return *this;}
            iterator operator++(int) {iterator retval = *this; ++(*this); return retval;}
            bool operator==(iterator other) const {return num == other.num;}
            bool operator!=(iterator other) const {return !(*this == other);}
            long operator*() {return num;}
        };
        iterator begin() {return FROM;}
        iterator end() {return TO >= FROM? TO+1 : TO-1;}
    };
    

    (Code from http://en.cppreference.com/w/cpp/iterator/iterator with original author's permission).

    Without std::iterator

    template
    class Range {
    public:
        class iterator {
            long num = FROM;
        public:
            iterator(long _num = 0) : num(_num) {}
            iterator& operator++() {num = TO >= FROM ? num + 1: num - 1; return *this;}
            iterator operator++(int) {iterator retval = *this; ++(*this); return retval;}
            bool operator==(iterator other) const {return num == other.num;}
            bool operator!=(iterator other) const {return !(*this == other);}
            long operator*() {return num;}
            // iterator traits
            using difference_type = long;
            using value_type = long;
            using pointer = const long*;
            using reference = const long&;
            using iterator_category = std::forward_iterator_tag;
        };
        iterator begin() {return FROM;}
        iterator end() {return TO >= FROM? TO+1 : TO-1;}
    };
    

提交回复
热议问题