2012-10-10 118 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的成員,或一個單獨的類包裹平原指針。

如果它是一個成員類,它取決於數組的大小。否則可能不會。