#include struct Node { Node* next() { return this; } Node* prev() { return this; } Node const* next() const { return this; } Node const* prev() const { return this; } }; template struct iter : boost::iterator_adaptor, V*, V, boost::bidirectional_traversal_tag> { typedef boost::iterator_adaptor, V*, V, boost::bidirectional_traversal_tag> super; iter() {} explicit iter(V* n) : super(n) {} template iter(iter const& x, typename boost::enable_if_convertible::type* = 0) : super(x.base()) {} friend class boost::iterator_core_access; private: void increment() { base_reference() = base()->next(); } void decrement() { base_reference() = base()->prev(); } }; int main() { typedef iter iterator; typedef iter const_iterator; Node n; iterator x(&n); const_iterator y(&n); y = x; ++x; }