quelle macro il faut utiliser ? Q_FOREACH ou BOOST_FOREACH ?
quelles differences ? la plus efficace ? la plus compatible ? vos conseils ?
merci
quelle macro il faut utiliser ? Q_FOREACH ou BOOST_FOREACH ?
quelles differences ? la plus efficace ? la plus compatible ? vos conseils ?
merci
d'apres mes tests:
sur un vector STL
BOOST_FOREACH ne copie pas la collection,
Q_FOREACH copie la collection
-1 pour Q_FOREACH ?
et pourquoi le foreach de Qt copie la collection ?
y-a-t-il un interet que je ne vois pas ?
Pas persuadé qu'il y ait une véritable copie. QT a tendance à user et abuser du COW.
Du coup, je soupçonne que ce doit être un moyen de poser un pseudo lock sur la variable manipulée, ce qui permettra de la bidouiller sans réfléchir depuis un autre thread.
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
c'est ce que je pensais aussi, mais je ne pense pas que ce soit si interessant que ca ... j'aime vraiment bien BOOST_FOREACHEnvoyé par Luc Hermitte
Boost.Foreach est conçu pour itérer des conteneurs ou itérateurs de type STL.
Q_FOREACH c'est fait pour fonctionner avec les conteneurs de Qt.
Ce sont donc des choses différentes.
pas tant que ca,Envoyé par loufoque
Q_FOREACH fonctionne aussi avec des conteneurs STL,
et BOOST_FOREACH fonctionne aussi avec des conteneurs Qt.
Perso, je n'ai envie d'utiliser aucune des deux. J'attends pour ce genre de chose une vraie solution dans le langage. Ne serait-ce que pour le problème de virgule que les deux solutions ont.
Mais effectivement, bien que la copie préalable de Q_FOREACH ne soit pas très gênante pour les conteneurs Qt, pour les autre conteneurs, elle me semble rédhibitoire. De même, le fait de ne pas pouvoir modifier les valeurs itérées me semble un inconvénient du Q_FOREACH.
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
C'est vrai qu'une solution dans le langage serait préférable, mais en attendant, je préfère utiliser BOOST_FOREACH, pour les raisons ci-dessus.
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++
Y'avait une proposition de Stroustrup pour le support des fonctions lambdas en natif, et ça permettrait de résoudre le problème de manière élégante aussi.
Dans une certaine mesure, boost::lambda suffit aussi, mais montre ses faiblesses dès qu'on utilise des structures.
La virgule sert de séparateur de macro, et le langage de macro ne sait pas que < et > servent de "parenthèses" pour des templates. Conclusion :
Le préprocesseur prend ça comme une macro à 3 arguments :
Code : Sélectionner tout - Visualiser dans une fenêtre à part MA_MACRO(std::pair<string, string> p, monConteneur);
- std::pair<string
- string> p
- monConteneur
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
si tu fais un typedef ca marcheEnvoyé par JolyLoic
et ca marche !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 typedef std::pair<string, string> pair_string_string; BOOST_FOREACH(pair_string_string p, monConteneur)
pourquoi s'en priver et attendre 5 ans le temps que tous les compilateurs se mettent a niveau ?
Oui, un typedef corrige le problème. Ca reste quand même non intuitif, plus lourd à écrire. Et je parie qu'en cas d'oubli, le message d'erreur n'est pas immédiatement compréhensible.
En fait, la vrai critère est que je ne ressent pas l'absence d'un for_each vraiment comme une privation. Clairement pas assez en tout cas pour réfléchir si je veux utiliser les macros existantes (et donc en forcer l'utilisation à mes collègues).
Ce qui me semble bien plus essentiel pour écrire des boucles aisément, c'est auto. Lui, si je pouvais en avoir une version bricolée qui marche à peu près, je me poserais sérieusement la question.
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Partager