libreria iterators iteradores ejemplos assigning c++ iterator

c++ - iterators - Operador prioritario*() de iteradores



list iterator c++ (2)

Digamos que tengo alguna estructura compleja definida por el usuario, como

struct usrStruct{ double a; T1 b; T2 c; /* and so on...*/ }

que se usa como un elemento básico para std :: vector, std :: list o cualquier cosa iterable ..

Digamos que std::vector<usrStruct> se pasa a una función mía a través de iteradores

template<class InputIterator> T myFoo( InputIterator first, InputIterator last ){ /*...*/ }.

P : ¿Existe una forma estándar de anular el operator*() del InputIterator (en este caso de std::vector<usrStruct>::iterator ) para que myFoo solo interactúe con el miembro a ?

es decir, para que

*first == (*first).a;

¿y así myFoo funciona ortogonalmente con respecto a la definición completa de usrStruct ?

Gracias.


No, no puedes hacer eso. Puede hacer que su estructura sea implícitamente convertible a doble (a través del operator double ). O puede permitir comparaciones directas sobrecargando operator==(usrSruct,double) y / o operator==(double,usrStruct) .


Puede crear un nuevo iterator basado en vector::iterator y reflejarlo como valores dobles y es realmente simple:

template< class BaseIterator > struct custom_iterator : std::iterator<std::iterate_traits<BaseIterator>::iterator_category, double> { public: typedef std::iterator<std::iterate_traits<BaseIterator>::iterator_category, double> base_t; typedef typename base_t::reference reference; public: custom_iterator( BaseIterator it ) : m_it( it ) {} public: reference operator*() const { return my_it->a; } custom_iterator& operator++ () {++m_it; return *this;} custom_iterator operator++ (int) { custom_iterator tmp( *this ); ++m_it; return *this; } bool operator==( custom_iterator const& rhs ) const { return m_it == rhs.m_it; } private: BaseIterator m_it; };

Y ahora puede usarlo como myFoo( custom_iterator(v.begin()), custom_iterator(v.end()) )