je suis intrigu=E9 par la fonction std::advance. Je lis dans la doc que
cette fonction utilise les op=E9rateur + et - dans le cas d'un
RandomIterator, et les operateurs ++ et -- sinon. Ma question est
donc, quand j'=E9cris :
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 =E9t=E9
impl=E9ment=E9es et que la r=E9solution des templates d=E9tecte que les
operateurs + et - sont pr=E9sents ou pas?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
ld
On 9 déc, 17:13, 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? 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.
On 9 déc, 17:13, Guillaume <g.gour...@gmail.com> 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? 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.
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
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
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
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
> 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 :
> 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
On Dec 9, 4:35 pm, Marc Duflot <marc.duf...@gmail.com> wrote:
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 :
> 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.
> 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 :
> 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
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 "+".
On Wed, 9 Dec 2009 08:13:07 -0800 (PST), Guillaume
<g.gourdin@gmail.com>:
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 "+".
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
On Dec 9, 5:13 pm, Guillaume wrote:
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.
On Dec 9, 5:13 pm, Guillaume <g.gour...@gmail.com> wrote:
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.
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.