#include #include #include #include class adapted_iterator : public boost::iterator_facade< adapted_iterator, std::string, std::input_iterator_tag> { typedef boost::iterator_facade< adapted_iterator, std::string, std::input_iterator_tag> base; public: adapted_iterator() : is(0) {} adapted_iterator(std::istream* is) : is(is) {} private: friend class boost::iterator_core_access; base::reference //std::string dereference() const { std::string s; getline(*is, s); return s; } void increment() { } bool equal(const adapted_iterator& another) const { bool at_eof1 = !is || is->eof(); bool at_eof2 = !another.is || another.is->eof(); return (at_eof1 == at_eof2); } private: std::istream* is; }; int main() { std::stringstream ss("1 \n234\n\n45"); for(adapted_iterator i(&ss), e; i != e; ++i) { std::cout << "'" << *i << "'\n"; } return 0; }