准备std :: iterator被弃用

标准委员会于3月21 投票批准了P0174中提出的std::iterator的弃用 :

对于读者来说,空的参数的长序列对于读者来说要简单得多,而不是简单地在类定义本身中提供预期的types定义,这是当前工作草案采用的方法,遵循C ++ 14中设置的模式

鼓励从std::iteratorinheritancePre-C ++ 17,从迭代器样板实现中移除繁琐的代码。 但是,弃用将需要这些东西之一:

  1. 迭代器样板现在需要包含所有必需的typedef
  2. 使用迭代器的algorithm现在需要使用auto而不是依赖迭代器来声明types
  3. Loki Astaribuild议 std::iterator_traits可以更新为无需inheritancestd::iterator

有人可以启发我,我应该期望哪些选项,因为我devise的自定义迭代器与C + + 17兼容性的眼睛?

选项3是选项1的一个更严格的input版本,因为您必须编写所有相同的typedefs但另外需要包装iterator_traits<X>

选项2作为解决scheme是不可行的。 你可以推导出一些types(例如reference只是decltype(*it) ),但是你不能推导出iterator_category 。 你不能区分input_iterator_tagforward_iterator_tag ,因为你不能自反地检查迭代器是否满足多通道保证。 此外,如果迭代器产生可变引用,则不能真正区分这些和output_iterator_tag 。 他们将不得不在某个地方明确提供。

这留下了选项1.猜猜我们应该习惯于写所有的样板。 就我而言,欢迎我们新的腕骨隧道霸主。

讨论的select是明确的,但我觉得需要一个代码示例。

鉴于不会有语言替代,而不依赖于boost或您自己的迭代器基类的版本,下面的代码使用std::iterator将固定到下面的代码。

std::iterator

 template<long FROM, long TO> 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;} }; 

(来自http://en.cppreference.com/w/cpp/iterator/iterator的原始作者的许可)。;

没有std::iterator

 template<long FROM, long TO> 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;} };