为了使用
基于范围的for循环,您必须提供
begin()
和
end()
成员函数或重载非成员
begin()
和
end()
函数。
在后一种情况下,您可以将范围包装在
std::pair
中,并为其重载
begin()
和
end()
函数:
namespace std
template <typename T> T* end(std::pair<T*, T*> const& p)
}
现在你可以像这样使用 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;
Example
for (auto& i: arr)
而不是array
。 - hmjd