je suis intrigué par la fonction std::advance. Je lis dans la doc que
cette fonction utilise les opérateur + et - dans le cas d'un
RandomIterator, et les operateurs ++ et -- sinon. Ma question est
donc, quand j'écris :
std::vector::iterator it;
std::advance( it, 5 );
comment la fonction std::advance pour savoir si 'it' est un
RandomIterator ou pas? Est-ce que deux versions de la fonction ont été
implémentées et que la résolution des templates détecte que les
operateurs + et - sont présents ou pas?
Merci pour vos éclaircissements.
la specialisation template se fait sur le type (au sens large), donc
pas sur + et - mais sur RandomIterator ou non.
a+, ld.
Gr�ce aux iterator_traits.
Si tu �cris ton propre it�rateur, tu peux en b�n�ficier en d�rivant de
random_iterator_tag.
--
Dr Marc Duflot -- CENAERO
B�timent �OLE, 1er �tage
Rue des Fr�res Wright, 29
B-6041 Gosselies, Belgium
Tel. : +32 (0)71 91.93.64
Fax. : +32 (0)71 91.93.31
> > je suis intrigu par la fonction std::advance. Je lis dans la
> > doc que cette fonction utilise les op rateur + et - dans le
> > cas d'un RandomIterator, et les operateurs ++ et -- sinon.
> > Ma question est donc, quand j' cris :
> > std::vector::iterator it;
> > std::advance( it, 5 );
> > comment la fonction std::advance pour savoir si 'it' est un
> > RandomIterator ou pas?
> Grâce aux iterator_traits.
> Si tu écris ton propre itérateur, tu peux en bénéficier en
> dérivant de random_iterator_tag.
Non en dérivant ; en y ajoutant des typedef voulu :
typedef ptrdiff_t difference_type;
typedef T value_type;
typedef T* pointer;
typedef T& reference;
typedef std::random_iterator_tag iterator_category;
Ou en dérivant de std::iterator (un template auquel il faut
fournir au moins les deux premiers paramètres : la catégorie
(std::random_iterator_tag, etc.) et le type de valeur.
Sinon, c'est aussi possible de définir ton propre spécialisation
de std::iterator_traits.
--
James Kanze
>std::vector::iterator it;
>std::advance( it, 5 );
>
>comment la fonction std::advance
La fonction std::advance n'existe pas. Il s'agit d'une fonction
template.
Quand tu �cris
std::advance( it, 5 );
le compilateur d�tecte que "it" a pour type "std::vector::iterator",
et convertit donc la ligne en :
std::advance <std::vector::iterator> ( it, 5 );
Il en profite pour cr�er cette fonction
"std::advance<std::vector::iterator>" � partir du template.
Cette fonction pr�cise ne se pr�occupe que du type
std::vector::iterator, donc utilise syst�matiquement l'op�rateur "+".
En plus des réponses données ci-dessus, je te conseille de faire une
recherche sur le principe de "tag dispatching". *advance* est
justement l'exemple classique qui accompagne une explication du
principe de tag dispatching.