En las respuestas a su publicación anterior, hubo un par de personas, incluida yo, que recomendaron el uso de const_iterators por motivos no relacionados con el rendimiento. Legibilidad, trazabilidad desde la placa de diseño hasta el código ... Usar const_iterators para proporcionar acceso mutante a un elemento no const es mucho peor que nunca usar const_iterators en absoluto. Está convirtiendo su código en algo que solo usted comprenderá, con un diseño peor y un dolor real de mantenimiento. Usar const para descartarlo es mucho peor que no usar const.
Si está seguro de quererlo, la parte buena/mala de C++ es que siempre puede obtener suficiente cuerda para colgarse. Si tu intención es usar const_iterator por problemas de rendimiento, realmente deberías reconsiderarlo, pero si aún quieres despegarte ... bueno, C++ puede proporcionarte el arma que elijas.
En primer lugar, el más simple: si sus operaciones toman los argumentos como const (incluso si aplica internamente const_cast), creo que debería funcionar directamente en la mayoría de las implementaciones (incluso si es probable un comportamiento indefinido).
Si no puede cambiar los funtores, puede abordar el problema desde cualquier lado: proporcione un contenedor iterador no consistente alrededor de los const iterators, o bien proporcione un envoltorio functor const alrededor de los funtores no const.
fachada iterador, el largo camino:
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
};
¿Estás utilizando boost :: multi_index? – tstenner
No uso la biblioteca de impulso. –