Jon*_*Mee 58 c++ standards iterator deprecated c++17
3月21 日,标准委员会投票赞成批准P0174中std::iterator提议的弃用:
对于读者而言,很长的void参数序列不仅仅是简单地
typedef在类定义本身中提供预期的s,这是当前工作草案采用的方法,遵循c ++中设置的模式14
在c ++ 17之前std::iterator,鼓励继承从迭代器样板实现中删除乏味.但弃用将需要以下其中一项:
typedefsauto而不是依赖于迭代器来声明类型std::iterator_traits,可以更新,而继承工作std::iterator有人可以告诉我我应该期待哪些选项,因为我设计了自定义迭代器,着眼于c ++ 17兼容性?
Ami*_*rsh 36
讨论的替代方案很明确,但我觉得需要一个代码示例.
鉴于不会有语言替代而且不依赖于boost或您自己的迭代器基类版本,以下使用std::iterator的代码将固定到下面的代码中.
std::iteratortemplate<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;}
};
Run Code Online (Sandbox Code Playgroud)
(来自http://en.cppreference.com/w/cpp/iterator/iterator并获得原作者许可的代码).
std::iteratortemplate<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;}
};
Run Code Online (Sandbox Code Playgroud)
Bar*_*rry 31
选项3是选项1的严格打字版本,因为您必须编写所有相同typedefs但另外包装iterator_traits<X>.
选项2作为解决方案是不可行的.你可以推断一些类型(例如reference只是decltype(*it)),但你不能推断iterator_category.由于无法反复检查迭代器是否满足多通道保证input_iterator_tag,因此无法区分forward_iterator_tag操作并且仅仅存在操作.此外,您无法真正区分这些以及output_iterator_tag迭代器是否产生可变引用.必须在某处明确提供它们.
这留下了选项1.猜猜我们应该习惯于编写所有样板文件.我是一个人,欢迎我们新的腕管道领主.