#include #include #include #include #include class B { public: B(std::vector vec) : _vec(vec) {} private: std::vector _vec; public: // iterator interface class const_iterator : public boost::iterator_adaptor::const_iterator, int const, boost::bidirectional_traversal_tag> { public: const_iterator(std::vector::const_iterator const& vec_it) : const_iterator::iterator_adaptor_(vec_it) {} const_iterator(const_iterator const& other) : const_iterator::iterator_adaptor_(other.base()) {} private: friend class boost::iterator_core_access; int const& dereference() const { m_mut_tmp = 2 * (*base()); //std::cerr << m_mut_tmp << std::endl; return m_mut_tmp; } mutable int m_mut_tmp; }; // iterator type is not in use, necessary to fulfill boosts Range Concept typedef const_iterator iterator; typedef std::vector::size_type size_type; const_iterator begin() const { return const_iterator(_vec.begin()); } const_iterator end() const { return const_iterator(_vec.end()); } size_type size() const { return _vec.size(); } }; int main(int argc, char * argv[]) { B b({1, 2}); boost::copy(b | boost::adaptors::reversed, std::ostream_iterator(std::cout, " ")); std::cout << std::endl; return 0; } // /usr/bin/c++ -g -Wall -std=c++0x -O0 iterator_adaptor_weirdness.cpp -o iterator_adaptor_weirdness // /usr/bin/c++ -g -Wall -std=c++0x -O1 iterator_adaptor_weirdness.cpp -o iterator_adaptor_weirdness // /usr/bin/c++ -g -Wall -std=c++0x -O1 iterator_adaptor_weirdness.cpp.o -o iterator_adaptor_weirdness -rdynamic -lboost_python -lboost_unit_test_framework-mt -lpython2.7