准备std :: iterator被弃用
标准委员会于3月21 日投票批准了P0174中提出的std::iterator
的弃用 :
对于读者来说,空的参数的长序列对于读者来说要简单得多,而不是简单地在类定义本身中提供预期的types定义,这是当前工作草案采用的方法,遵循C ++ 14中设置的模式
鼓励从std::iterator
inheritancePre-C ++ 17,从迭代器样板实现中移除繁琐的代码。 但是,弃用将需要这些东西之一:
- 迭代器样板现在需要包含所有必需的
typedef
- 使用迭代器的algorithm现在需要使用
auto
而不是依赖迭代器来声明types - 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_tag
和forward_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;} };