要使用基于范围的 for 循环,您必须提供begin()
andend()
成员函数或重载非成员begin()
andend()
函数。在后一种情况下,您可以将您的范围包装在 astd::pair
和重载中begin()
,并且end()
对于那些:
namespace std {
template <typename T> T* begin(std::pair<T*, T*> const& p)
{ return p.first; }
template <typename T> T* end(std::pair<T*, T*> const& p)
{ return p.second; }
}
现在您可以像这样使用 for 循环:
for (auto&& i : std::make_pair(array, array + size))
cout << i << endl;
请注意,非成员begin()
和end()
函数必须在std
此处的命名空间中重载,因为pair
也位于命名空间中std
。如果您不想篡改标准命名空间,您可以简单地创建自己的小对类begin()
并end()
在您的命名空间中重载。
或者,围绕动态分配的数组创建一个瘦包装器并提供begin()
和end()
成员函数:
template <typename T>
struct wrapped_array {
wrapped_array(T* first, T* last) : begin_ {first}, end_ {last} {}
wrapped_array(T* first, std::ptrdiff_t size)
: wrapped_array {first, first + size} {}
T* begin() const noexcept { return begin_; }
T* end() const noexcept { return end_; }
T* begin_;
T* end_;
};
template <typename T>
wrapped_array<T> wrap_array(T* first, std::ptrdiff_t size) noexcept
{ return {first, size}; }
您的呼叫站点如下所示:
for (auto&& i : wrap_array(array, size))
std::cout << i << std::endl;
例子