如果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;
您传递到基于范围的 for 循环中的任何内容都需要具有返回迭代器的 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 的那种类型的指针,这可能会导致令人困惑的结果。