line_iterator
今日は時間がなくて、こんなのしかできませんでした。
誰もが一度は作りそうなistream_iteratorのgetline版です。
#include <boost/iterator/iterator_facade.hpp> #include <iosfwd> #include <string> namespace hamigaki { template<typename CharT> class line_iterator : public boost::iterator_facade< line_iterator<CharT>, const std::basic_string<CharT>, boost::single_pass_traversal_tag > { friend class boost::iterator_core_access; public: typedef CharT char_type; typedef std::basic_istream<CharT> istream_type; typedef std::basic_string<CharT> string_type; line_iterator() : in_ptr_(0) { } explicit line_iterator(istream_type& is) : in_ptr_(&is) { increment(); } private: istream_type* in_ptr_; string_type line_; const string_type& dereference() const { return line_; } void increment() { if (!std::getline(*in_ptr_, line_)) in_ptr_ = 0; } bool equal(const line_iterator& rhs) const { return in_ptr_ == rhs.in_ptr_; } }; template<class CharT> inline line_iterator<CharT> make_line_iterator(std::basic_istream<CharT>& is) { return line_iterator<CharT>(is); } template<class CharT> inline line_iterator<CharT> make_line_iterator() { return line_iterator<CharT>(); } } // namespace hamigaki
basic_stringの型特徴とアロケータを指定できると良いのですが、時間切れ。