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()) )