规范的事情是只从std::iterator<std::forward_iterator_tag, T>
继承。迭代器只有一个类别。
该标准对于也是前向迭代器的输出迭代器没有算法(或其他用途)。标准中输出迭代器的所有用途只需要单遍。
相反,该标准的想法是可变的与不可变的迭代器的类别forward/bidi/randomaccess。所有需要通过迭代器写入的算法,需要比单遍更好的算法,也可以通过它们写入的相同迭代器读取。这是std::remove
,std::sort
和其他变异算法。
可变和不可变迭代器之间的差异不会被迭代器标记检测到,而是由赋值表达式是否格式良好决定的。因此,举例来说,如果您将迭代器传递给std::sort
,这是不可变的,那么该算法无论如何都不会编译,所以通常不需要使用output_iterator_tag
来标记输入迭代器。所有需要OutputIterator
的算法都可以使用可变的ForwardIterator
,同样也不需要使用output_iterator_tag
来标记它。
如果你有不同于标准算法的需求,那么我不能立即想到你的提议对你的迭代器不起作用的原因。但它不会检测可变标准迭代器。例如std::deque<int>::iterator
和int*
的迭代器类别为random_access_iterator_tag
,而不是您的私有标记,并且与output_iterator_tag
没有任何关系。所以你可能会更好地定义你自己的特质类,而不是希望适应现有的iterator_traits::iterator_category
来提供你想要的信息。
继承他们两个都会做 –
作为一个侧面的问题:有谁知道这些可变的迭代器标签是否被认为是标准库?如果是这样,为什么他们不包括在内? –