2012-10-10 48 views
5

下面的代码编译罚款我的系统上的数组:迭代器大小不同

#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

“template void foobar(Itearator_type it)''有什么问题? – Lol4t0

+1

@ Lol4t0它太笼统了,不能满足我对知识的渴望? – fredoverflow

+0

我的意思是,如果代码适用于_given_迭代器,为什么要施加人为限制?这2条评论仅与您问题的最后一部分相关。 – Lol4t0

回答

3

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

1

简单的答案是让它更具通用性。你为什么只想要允许来自std::array的迭代器?

template <typename Iterator> 
void foobar(Iterator it) 

在第二代码段,该型T和尺寸n是在非可推论上下文。从概念上讲多个std::array类型可能具有相同的iterator类型,或者你提到它可以只是T*,这将是不可能找到什么可能的std::arrayT*作为iterator

+0

事实上,* actual *的答案更简单*:*“不,这不是标准保证。”* –

4

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

typedef implementation-defined iterator; 

的迭代器类型可以是一个普通的指针,一类是array的成员,或一个单独的类包裹平原指针。

如果它是一个成员类,它取决于数组的大小。否则可能不会。