迭代器到不同大小的数组

时间:2012-10-10 16:18:22

标签: c++ arrays templates c++11 iterator

以下代码在我的系统上编译正确:

#include <array>
#include <type_traits>

static_assert(std::is_same<std::array<int, 5>::iterator,
                           std::array<int, 7>::iterator>::value, ":(");

标准是否保证了这种行为?迭代器类型是否与数组大小无关?

如果有保证,有没有办法从元素类型中抽象出来并忽略大小?

template<typename T, size_t n>
void foobar(std::array<T, n>::iterator it)

也就是说,有没有办法在不提及大小n的情况下编写上面特定于数组的代码?

请注意,我不想诉诸T*,即使在发布模式下,迭代器可能是T*

3 个答案:

答案 0 :(得分:4)

不,没有保证。标准只是说

typedef implementation-defined    iterator;

迭代器类型可以是普通指针,是array成员的类,也可以是包装普通指针的单独类。

如果它是成员类,依赖于数组大小。否则可能不会。

答案 1 :(得分:3)

不,这不保证。每个数组类型array<T, size_t>都有一个名为iterator的嵌套成员typedef,其类型是实现定义的。

答案 2 :(得分:1)

简单的答案是让它更通用一点。为什么你只想允许来自std::array

的迭代器
template <typename Iterator>
void foobar( Iterator it )

在第二段代码中,类型T和大小n处于不可导入的上下文中。从概念上讲,多个std::array类型可能具有相同的iterator类型,或者您提到的类型可能只有T*,并且无法找到std::array可能的T* { {1}} iterator

相关问题