quelle macro il faut utiliser ? Q_FOREACH ou BOOST_FOREACH ?
quelles differences ? la plus efficace ? la plus compatible ? vos conseils ?
merci
Version imprimable
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.
c'est ce que je pensais aussi, mais je ne pense pas que ce soit si interessant que ca ... j'aime vraiment bien BOOST_FOREACHCitation:
Envoyé 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,Citation:
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.
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.
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.
Quel probleme de virgule ?Citation:
Envoyé par JolyLoic
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:MA_MACRO(std::pair<string, string> p, monConteneur);
- std::pair<string
- string> p
- monConteneur
si tu fais un typedef ca marcheCitation:
Envoyé par JolyLoic
et ca marche !!!Code:
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.