In the answers to your previous post, there were a couple of people, me included, that recommended using const_iterators instead for non-performance related reasons. Readability, traceability from the design board to the code... Using const_iterators to provide mutating access to a non-const element is much worse than never using const_iterators at all. You are converting your code into something that only you will understand, with a worse design and a real maintainability pain. Using const just to cast it away is much worse than not using const at all.
If you are sure you want it, the good/bad part of C++ is that you can always get enough rope to hang yourself. If your intention is using const_iterator for performance issues, you should really rethink it, but if you still want to shoot your foot off... well C++ can provide your weapon of choice.
First, the simplest: if your operations take the arguments as const (even if internally apply const_cast) I believe it should work directly in most implementations (even if it is probably undefined behavior).
If you cannot change the functors, then you could tackle the problem from either side: provide a non-const iterator wrapper around the const iterators, or else provide a const functor wrapper around the non-const functors.
Iterator façade, the long road:
template <typename T> struct remove_const { typedef T type; }; template <typename T> struct remove_const<const T> { typedef T type; }; template <typename T> class unconst_iterator_type { public: typedef std::forward_iterator_tag iterator_category; typedef typename remove_const< typename std::iterator_traits<T>::value_type >::type value_type; typedef value_type* pointer; typedef value_type& reference; unconst_iterator_type( T it ) : it_( it ) {} // allow implicit conversions unconst_iterator_type& operator++() { ++it_; return *this; } value_type& operator*() { return const_cast<value_type&>( *it_ ); } pointer operator->() { return const_cast<pointer>( &(*it_) ); } friend bool operator==( unconst_iterator_type<T> const & lhs, unconst_iterator_type<T> const & rhs ) { return lhs.it_ == rhs.it_; } friend bool operator!=( unconst_iterator_type<T> const & lhs, unconst_iterator_type<T> const & rhs ) { return !( lhs == rhs ); } private: T it_; // internal (const) iterator };