#include #include #include #include class vector_iterator : public boost::iterator_facade< vector_iterator, int, boost::random_access_traversal_tag> { public: vector_iterator(char tag, std::vector::iterator it) : _tag(tag), _it(it) {} private: friend class boost::iterator_core_access; int& dereference() const { return *_it; } bool equal(vector_iterator const& other) const { return _it == other._it; } void increment() { ++_it; } void decrement() { --_it; } void advance(int n) { std::advance(_it, n); } std::vector::iterator::difference_type distance_to(const vector_iterator& other) const { std::cerr << _tag << ".distance_to(" << other._tag << ")\n"; std::vector::iterator::difference_type result = std::distance(_it, other._it); std::cerr << "result = " << result << '\n'; return result; } private: const char _tag; std::vector::iterator _it; }; int main() { std::vector v; v.push_back(1); v.push_back(2); vector_iterator a('a', v.begin()); vector_iterator b('b', v.end()); std::cerr << std::distance(a, b) << '\n'; }