如果InputReader
在頭文件作爲常量大小的數組聲明,那麼它應該工作,只要你#include <array>
或#include <iterator>
或任何其他幾個庫頭,使您獲得的聲明
template<typename T, std::size_t N> T* std::begin(T (&array)[N]);
template<typename T, std::size_t N> T* std::end(T (&array)[N]);
但如果InputReader
聲明類似
extern InputReaderObject* InputReader;
或者
extern InputReaderObject InputReader[];
...?這不是從明顯的有多少個對象數組中,但是讓我們假設相同的標題也有類似:
extern unsigned int InputReaderSize;
任何你傳遞到範圍爲基礎的循環需要有begin
和end
功能,這回迭代器。 (該功能可以爲類成員,通過參數相關的查找找到,或者在namespace std
)的標準庫定義爲實際陣列和標準集裝箱一些begin
和end
功能,但你可以通過定義自己的擴展它:
#include <iterator>
struct InputReaderLoopType {
InputReaderObject* begin() const { return InputReader; }
InputReaderObject* end() const { return InputReader + InputReaderSize; }
};
extern const InputReaderLoopType InputReaderLoop;
會讓你做......
for (InputReaderObject& irb : InputReaderLoop)
(製作irb
的參考,而不是副本,只是一個建議,你可能真的需要複製的某些原因。)
如果您確實希望循環與InputReader
一起工作,您也可以定義InputReaderObject* begin(InputReaderObject*);
和InputReaderObject* end(InputReaderObject*);
。但是如果有人有一個不是InputReader
的類型的指針,那可能會導致令人困惑的結果。
顯示'InputReader'的聲明會有很大幫助。 – 2012-08-10 03:49:51