Quelle est la procédure standard pour ça ? J'ai un nouvel iterator_tag foo, comment doté transform etc du comportement que je souhaite pour des itérateurs de ce type ?
Quelle est la procédure standard pour ça ? J'ai un nouvel iterator_tag foo, comment doté transform etc du comportement que je souhaite pour des itérateurs de ce type ?
En proposant des nouvelles surcharges pour ton tag qui seront candidates au tag dispatching qu'effectuent normalement les algos standards ?
(en assumant que tu as déjà spécialisé iterator_traits pour des nouveaux itérateurs qui ont le tag en question)
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
Normallement, et si j'ai bien compris la norme, en plus d'avoir une fonction std::transform<clas In, class Out, class Fn> transform(In,In,Out,Fn), tu as aussi une fonction à spécialiser std::transform<clas In, class Out, class Fn,class InTag,class OutTag> transform(In,In,Out,Fn,InTag,OutTag).
La première appelle la seconde, les deux derniers paramètres étant égaux à
std::iterator_traits<In>::iterator_category()
std::iterator_traits<Out>::iterator_category()
(d'où la nécessite de spécialiser iterator_traits<> pour ton type itérateur).
libstdc++ de g++4.4 implémente les iterator tags donc tu peux jeter un oeil. Le problème que je lui trouve, c'est que cette librairie rajoute un double underscore devant le nom de la fonction. Donc en gros, au lieu de spécialiser transform, tu spécialise __transform.
Ensuite, c'est l'implémenteur qui a choisi quelle fonction pouvait être spécialisée. Pour g++4.4, j'ai mal choisi mon exemple : transform n'est pas spécialisable de cette façon. La norme ne donne pas de liste de fonction spécialisable sur cette base.
La solution extrême, c'est donc de spécialiser directement sur le type des itérateurs (ce qui est autorisé par la norme).
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.
Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.
Merci Emmanuel. J'en était arriver a une conclusion similaire mais je ne me sentais pas d'ouvrir std comme si de rien n'était. Merci pour la confirmation.
Le truc, c'est que comme la norme ne spécifie pas le nom de la fonction sous-jacente appelée, je ne sais pas trop comment ça va pouvoir se faire de manière correcte et portable...
Edit: je viens de vérifier, et c'est effectivement le cas. Du coup, ça rends difficile voir impossible l'extension de la librairie standard avec un nouveau type d'itérateur. Je vais essayer de remonter ça.
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.
Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.
OK merci. Le top serait un std::ext::<nom de la fonction>
Partager