Qt 4 a défini une macro Q_FOREACH (aussi accessible comme pseudo mot clé foreach) pour faciliter l’itération dans ses conteneurs (comme QList ou QStringList). Cependant, son mode de fonctionnement n’est pas idéal : tout le conteneur est copié dans une instance de QForeachContainer avant que la boucle commence effectivement, cette syntaxe n’est pas non plus compatible avec des tableaux C. Dès Qt 5.9 (ou un peu après), cette construction devrait être marquée comme obsolète dans Qt : C++11 propose une construction très similaire, qui sera dorénavant privilégiée (les développeurs de Qt peuvent maintenant utiliser cette nouvelle version de C++, la compatibilité avec C++03 n’étant plus garantie depuis la version 5.7).| Code : | Sélectionner tout |
1 2 | Q_FOREACH(int i, container) // Dès Qt 4 for (int i : container) // C++ 11 |
Cette implémentation peut même être tirée à profit dans certains bouts de code : puisque l’itération se passe sur une copie du conteneur initial, il est possible d’ajouter des éléments dans ce conteneur initial sans affecter l’itération. Bien sûr, dans ce cas, une copie en profondeur doit avoir lieu, mais le code fonctionne (contrairement à sa version C++11).
| Code : | Sélectionner tout |
1 2 | Q_FOREACH(const QString &lang, languages)
languages += getSynonymsFor(lang); |
| Code : | Sélectionner tout |
1 2 3 | const auto languagesCopy = languages;
for(const auto& lang : languagesCopy)
languages += getSynonymsFor(lang); |
De manière générale, utiliser foreach consomme une centaine d’octets de plus que la même boucle avec la construction C++11 : ce gain peut être appréciable dans le monde de l’embarqué, où la mémoire est une ressource rare.
Source et exemples de code : Goodbye, Q_FOREACH.
Vous avez lu gratuitement 6 186 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.