#include<boost/iterator/iterator_adaptor.hpp> #include<boost/range/adaptor/reversed.hpp> #include<boost/range/algorithm/copy.hpp> #include<vector> #include<iostream> class B { public: B(std::vector<int> vec) : _vec(vec) {} private: std::vector<int> _vec; public: // iterator interface class const_iterator : public boost::iterator_adaptor<const_iterator, std::vector<int>::const_iterator, int const, boost::bidirectional_traversal_tag> { public: const_iterator(std::vector<int>::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<int>::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<int>(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