Để tận dụng các phạm vi có trụ sở tại vòng bạn phải cung cấp một trong hai begin()
và end()
hàm thành viên hoặc quá tải không thành viên begin()
và end()
chức năng. Trong trường hợp sau, bạn có thể quấn phạm vi của bạn trong một std::pair
và quá tải begin()
và end()
cho những:
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; }
}
Bây giờ bạn có thể sử dụng cho vòng lặp như thế này:
for (auto&& i : std::make_pair(array, array + size))
cout << i << endl;
Lưu ý, rằng các hàm không phải là thành viên begin()
và end()
phải được quá tải trong không gian tên std
tại đây, bởi vì pair
cũng nằm trong không gian tên std
. Nếu bạn không muốn giả mạo không gian tên chuẩn, bạn có thể chỉ cần tạo một lớp cặp nhỏ của riêng bạn và quá tải begin()
và end()
trong không gian tên của bạn.
Hoặc, tạo một wrapper mỏng xung quanh mảng cấp phát động của bạn và cung cấp begin()
và end()
thành viên chức năng:
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}; }
Và trang web cuộc gọi của bạn trông như thế này:
for (auto&& i : wrap_array(array, size))
std::cout << i << std::endl;
Example
Nguồn
2013-04-10 07:42:14
gì các lỗi có nói gì không? Ít nhất bài ** one ** lỗi – Default
nó được gọi là phạm vi dựa trên vòng lặp và SO và Google có tấn ví dụ – stijn
[Lỗi] C: \ Users \ Siegfred \ Documents \ C-Free \ Temp \ Untitled2.cpp: 16: 16: lỗi: không có chức năng phù hợp cho cuộc gọi đến 'bắt đầu (int * &)' –