iterator_traits的设计目的是什么?

use*_*627 1 c++ templates std

C++ 标准库定义了iteratoriterator_traits模板。看来一般来说,iterator_traits只是提取 中明确定义的属性iterator。如果iterator_traits要使用a则iterator直接使用对应的即可。T*如果需要某种类型的专门化(例如),则 的专门化iterator可以满足要求。这种间接的好处是什么?

eer*_*ika 12

一般来说, iterator_traits 似乎只是提取在迭代器中显式定义的属性。如果要使用iterator_traits,可以直接使用对应的iterator。

并非所有迭代器都可以输入别名作为成员。

这种间接的好处是什么?

让所有迭代器有一个统一的接口。更具体地说,指针也是迭代器,并且作为非类类型,指针不能具有成员。

因此,例如,当迭代器的用户想要回答“所指向的对象的类型是什么an_iterator_type”这个问题时,他们无法使用an_iterator_type::value_type,因为无法为所有迭代器(特别是指针)定义该类型。他们可以使用的是std::iterator_traits<an_iterator_type>::value_type可以为所有迭代器定义的 - 包括指针。这就是 的目的std::iterator_traits


该标准定义了std::iterator_traits<T*>指针的专业化。尽管可以,但您不需要为自定义迭代器类型定义专门化,因为您可以将类型定义为成员,这些成员将由 的泛型定义使用std::iterator_traits

的目的std::iterator是选择性地用作基类来帮助定义自定义迭代器的成员类型。然而,它的使用从来没有必要,它被认为是一个有缺陷的设计,并且长期以来不鼓励使用它。自 C++17 起,它已被弃用,并且可能会从未来的标准中删除。

一个希望能够说明设计问题的示例std::iterator

// using the deprecated std::iterator
struct iterator : std::iterator<
    std::input_iterator_tag,   // OK so far
    long,                      // can you guess what member this argument defines?
    long,                      // how about this?
    const long*,               // you can probably guess this one
    long>                      // still, no clue
{
    ...

// recommended way without using std::iterator
struct iterator
{
    using iterator_category = std::input_iterator_tag;
    using value_type = long;
    using difference_type = long;
    using pointer = const long*;
    using reference = long;
    ...
Run Code Online (Sandbox Code Playgroud)