for each
tuyên bố trong VC++, khi được sử dụng trên một tổ chức phi quản lý lớp:
for each (T x in xs)
{
...
}
chỉ là cú pháp đường cho việc này:
for (auto iter = xs.begin(), end = xs.end(); iter != end; ++iter)
{
T x = *iter;
}
đâu auto
có nghĩa là loại biến được suy luận tự động từ loại khởi tạo.
Nói cách khác, bạn cần phải cung cấp các phương thức begin()
và end()
trên lớp của mình để trả về trình bắt đầu đầu vào và kết thúc cho nó.
Dưới đây là một ví dụ của lớp đó kết thúc tốt đẹp một istream
và cho phép bạn duyệt qua tất cả các dòng trong đó:
#include <istream>
#include <iostream>
#include <fstream>
#include <string>
class lines
{
public:
class line_iterator
{
public:
line_iterator() : in(0)
{
}
line_iterator(std::istream& in) : in(&in)
{
++*this;
}
line_iterator& operator++()
{
getline(*in, line);
return *this;
}
line_iterator operator++ (int)
{
line_iterator result = *this;
++*this;
return result;
}
const std::string& operator*() const
{
return line;
}
const std::string& operator->() const
{
return line;
}
friend bool operator== (const line_iterator& lhs, const line_iterator& rhs)
{
return (lhs.in == rhs.in) ||
(lhs.in == 0 && rhs.in->eof()) ||
(rhs.in == 0 && lhs.in->eof());
}
friend bool operator!= (const line_iterator& lhs, const line_iterator& rhs)
{
return !(lhs == rhs);
}
private:
std::istream* const in;
std::string line;
};
lines(std::istream& in) : in(in)
{
}
line_iterator begin() const
{
return line_iterator(in);
}
line_iterator end() const
{
return line_iterator();
}
private:
std::istream& in;
};
int main()
{
std::ifstream f(__FILE__);
for each (std::string line in lines(f))
{
std::cout << line << std::endl;
}
}
Lưu ý rằng việc thực hiện line_iterator
thực sự là hơi lớn hơn mức tối thiểu cần thiết cho for each
; Tuy nhiên, nó là việc thực hiện tối thiểu phù hợp với yêu cầu iterator đầu vào, và do đó lớp này cũng là có thể sử dụng với tất cả các thuật toán STL mà làm việc trên lặp đầu vào, chẳng hạn như std::for_each
, std::find
, vv
Nguồn
2009-10-26 17:34:22
Trình biên dịch MS không bao giờ hỗ trợ anyting như thế cho mã C++. Tôi đoán bạn đang nói về một số ngôn ngữ khác. C#? Nếu vậy, bạn cần phải gắn thẻ lại câu hỏi của mình. – AnT
http://msdn.microsoft.com/en-us/library/ms177202%28VS.80%29.aspx – stelonix
Có lẽ thẻ C++ phải là thẻ vC++. Điều này chắc chắn không phải là một câu hỏi tiêu chuẩn C++. – MAK