如果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