В итоге написал что-то вроде этого:
template<bool is_const_iterator>
class CMetaIterator : public std::iterator<std::random_access_iterator_tag, T> {
public:
typedef T value_type;
typedef typename std::conditional<is_const_iterator, const value_type&, value_type&>::type reference;
typedef typename std::conditional<is_const_iterator, const value_type*, value_type*>::type pointer;
...
reference operator*() const;
pointer operator->() const;
...
};
typedef CMetaIterator<false> CIterator;
typedef CMetaIterator<true> CConstIterator;
typedef std::reverse_iterator<CIterator> CReverseIterator;
typedef std::reverse_iterator<CConstIterator> CReverseConstIterator;