以下代码在我的系统上编译正确:
#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*
。
答案 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