В ответах на ваш предыдущий пост было несколько человек, включая меня, которые рекомендовали вместо этого использовать const_iterators по причинам, не связанным с производительностью. Читаемость, прослеживаемость от платы разработки до кода ... Использование const_iterators для обеспечения изменяющегося доступа к неконстантному элементу намного хуже, чем никогда вообще не использовать const_iterators. Вы преобразуете свой код во что-то, что только вы поймете, с худшим дизайном и реальной болью в обслуживании. Использование const просто для того, чтобы отбросить его, гораздо хуже, чем вообще не использовать const.
Если вы уверены, что хотите этого, то хорошая / плохая часть C ++ в том, что вы всегда можете получить достаточно веревки, чтобы повеситься. Если вы намерены использовать const_iterator для проблем с производительностью, вам действительно следует переосмыслить его, но если вы все еще хотите отстрелить ногу ... хорошо, C ++ может предоставить ваше оружие выбора.
Во-первых, самое простое: если ваши операции принимают аргументы как const (даже если внутренне применяется const_cast), я считаю, что это должно работать напрямую в большинстве реализаций (даже если это, вероятно, неопределенное поведение).
Если вы не можете изменить функторы, то вы можете решить проблему с любой стороны: предоставить неконстантную обертку итератора вокруг константных итераторов или же предоставить обертку константного функтора вокруг неконстантных функторов.
Фасад итератора, длинный путь:
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
};