我正在尝试构建一个嵌套的迭代器模板,并依靠具有value_type
之类的各种特征的迭代器。但事实证明,并非所有STL类型甚至都返回具有这些特征的迭代器。例如:
#include <array>
#include <type_traits>
template <typename T>
using iterator_t = decltype(std::declval<T>().begin());
static_assert(std::is_same_v<iterator_t<std::array<int, 3>>, int*>);
此代码编译并显示数组迭代器的实际类型为int*
。在那种情况下,我如何仍然可以访问value_type
等特征?
答案 0 :(得分:7)
该标准未指定迭代器的实现方式以及确切的类型。实际上,像int*
这样的指针确实满足了std::array
的迭代器的要求,因此实现是相当合法的。
您可以使用std::iterator_traits
来将value_type
设为std::iterator_traits<iterator_t<std::array<int, 3>>>::value_type
,它也适用于指针。
答案 1 :(得分:5)
int*
是迭代器,因为它满足了迭代器的所有必要要求。
非正式地:
您可以引用(除非它已超出数组的最后一个元素)。
您可以递增它(因为它是数组中的指针)。
您可以复制 int*
到另一个int*
。
您可以使用std::swap
作为类型来调用int*
。