std::advance

Le
Guillaume
Bonjour à tous

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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
ld
Le #20730151
On 9 déc, 17:13, Guillaume
Bonjour à tous

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?



la specialisation template se fait sur le type (au sens large), donc
pas sur + et - mais sur RandomIterator ou non.

a+, ld.
Marc Duflot
Le #20730141
Guillaume wrote:
Bonjour à tous

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.

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

http://research.cenaero.be/people/duflot/
James Kanze
Le #20730791
On Dec 9, 4:35 pm, Marc Duflot
Guillaume wrote:



> 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
Fabien LE LEZ
Le #20731221
On Wed, 9 Dec 2009 08:13:07 -0800 (PST), Guillaume

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 "+".
Alp Mestan
Le #20784741
On Dec 9, 5:13 pm, Guillaume
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?



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.
Publicité
Poster une réponse
Anonyme