L'enfer de la STL
Le
Alain Ketterlin
Salut,
J'utilise pas mal la STL, avec des combinaisons du genre :
map < pair<Truc*,Truc*> , set<Truc*> > m;
(pour la plus simple). Pour diverses raisons, j'essaie d'éviter les
typedef. Donc je me retrouve avec des boucles comme :
for ( map < pair<Truc*,Truc*> , set<Truc*> >::iterator it=m.begin() ;
it!=m.end() ; it++ )
{ }
D'où mes deux questions :
1) y a-t-il plus court ? (Hors for_each, qui ne m'intéresse pas parce
que mes corps de boucle sont éventuellement longs, et je n'ai pas
envie de les rejeter chacun dans une classe.)
2) Quelqu'un a-t-il des informations sur la standardisation
(éventuelle) et l'implémentation de "auto" dans g++ ? Je n'ai rien
trouvé de précis. Quand pourrais-je écrire
for ( auto it=m.begin() ; it!=m.end() ; it++ )
Question subsidiaire : en essayant d'écrire une macro pour remplacer
la tête de boucle ci-dessus, j'ai remarqué que le préprocesseur ne
connait rien aux templates. Si j'écris
#define FOREACH(T,c,v) for ( T :: iterator v=c.begin() )
alors il couine sur
FOREACH(pair<Truc1,Truc2>,m,it)
parce qu'il ne comprend pas que la première virgule est entre < et >.
Savez-vous si il est prévu que ça change ?
Merci d'avance. J'espère avoir raté quelque chose d'évident.
-- Alain.
J'utilise pas mal la STL, avec des combinaisons du genre :
map < pair<Truc*,Truc*> , set<Truc*> > m;
(pour la plus simple). Pour diverses raisons, j'essaie d'éviter les
typedef. Donc je me retrouve avec des boucles comme :
for ( map < pair<Truc*,Truc*> , set<Truc*> >::iterator it=m.begin() ;
it!=m.end() ; it++ )
{ }
D'où mes deux questions :
1) y a-t-il plus court ? (Hors for_each, qui ne m'intéresse pas parce
que mes corps de boucle sont éventuellement longs, et je n'ai pas
envie de les rejeter chacun dans une classe.)
2) Quelqu'un a-t-il des informations sur la standardisation
(éventuelle) et l'implémentation de "auto" dans g++ ? Je n'ai rien
trouvé de précis. Quand pourrais-je écrire
for ( auto it=m.begin() ; it!=m.end() ; it++ )
Question subsidiaire : en essayant d'écrire une macro pour remplacer
la tête de boucle ci-dessus, j'ai remarqué que le préprocesseur ne
connait rien aux templates. Si j'écris
#define FOREACH(T,c,v) for ( T :: iterator v=c.begin() )
alors il couine sur
FOREACH(pair<Truc1,Truc2>,m,it)
parce qu'il ne comprend pas que la première virgule est entre < et >.
Savez-vous si il est prévu que ça change ?
Merci d'avance. J'espère avoir raté quelque chose d'évident.
-- Alain.

Poser une question


Pas que je sache.
Il n'est pas prevu que ca change (conceptuellement le preprocesseur
fonctionne a un moment ou il est impossible de savoir si pair est un
template ou pas.
Sauf erreur de ma part,
FOREACH((pair<Truc1,Truc2>), m, it)
devrait fonctionner.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++...index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Oh j'espérais plus simple, du genre considérer comme atomique ce qui
se trouve entre une option, puique GNU cpp a déjà -x et -std.
Malheureusement non, impossible de caser un type entre parenthèse.
Merci pour ton aide.
-- Alain.
Il y a des endroits dans les types ou on peut mettre des parentheses,
mais pas dans ce qui qualifie les noms.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++...index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
typedef est ton ami.
Quels peuvent être les raisons qui peuvent pousser à ne pas employer
une technique propre ?
Ce n'est visiblement pas encore implémenté
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org