我正在尝试构建一个嵌套迭代器模板,并依赖于具有各种特征(如
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
等特征?
该标准没有指定迭代器应该如何实现以及它应该是什么类型。 它只是说
std::array
是一个 ContigouslyContainer,这意味着它的迭代器是 ContigouslyIterator。
事实上,像
int*
这样的指针确实满足了std::array
迭代器的要求,所以它的实现是相当合法的。
std::iterator_traits
来获取 value_type
,例如:
std::iterator_traits<std::iterator_t<std::array<int, 3>>>::value_type
它也适用于指针。
int*
是迭代器,因为它满足迭代器所需的所有要求。
非正式地:
您可以尊重它(除非它超过了数组的最后一个元素)。
您可以递增它(因为它是数组中的指针)。
您可以复制
int*
到另一个int*
。您可以使用
std::swap
作为类型来调用 int*
。