Nelle risposte al tuo post precedente, c'erano un paio di persone, me incluso, che raccomandavano l'uso di costitutori invece per motivi non correlati alle prestazioni. Leggibilità, tracciabilità dalla scheda di progettazione al codice ... L'utilizzo di costitutori per fornire l'accesso di muting a un elemento non const è molto peggiore che mai con l'uso di const_iterators. Stai convertendo il tuo codice in qualcosa che solo tu capirai, con un design peggiore e un vero dolore alla manutenibilità. Usare const per buttarlo via è molto peggio che non usare affatto const.
Se sei sicuro di volerlo, la parte buona/cattiva del C++ è che puoi sempre avere abbastanza corda da impiccarti. Se la tua intenzione è utilizzare const_iterator per problemi di prestazioni, dovresti davvero ripensarlo, ma se vuoi comunque sparare a calci ... beh, il C++ può fornire la tua arma preferita.
In primo luogo, il più semplice: se le tue operazioni accettano gli argomenti come const (anche se internamente si applicano const_cast) credo che dovrebbe funzionare direttamente nella maggior parte delle implementazioni (anche se è probabilmente un comportamento indefinito).
Se non è possibile modificare i funtori, è possibile risolvere il problema da entrambi i lati: fornire un wrapper non-const iterator attorno agli iteratori const, oppure fornire un wrapper const functor attorno ai funtori non-const.
facciata Iterator, la lunga strada:
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
};
fonte
2009-04-19 12:49:08
Stai utilizzando boost :: multi_index? – tstenner
Non uso la libreria boost. –