6 votes

Avez-vous eu l'occasion de remplacer BOOST_FOREACH par une boucle for basée sur l'intervalle à partir de C++11 ?

Avez-vous déjà procédé au remplacement du BOOST_FOREACH par la gamme basée sur for boucle ? Y a-t-il des inconvénients à le faire mécaniquement (c'est-à-dire sans faire une étude approfondie du code environnant).

Le contexte : J'ai des sources avec environ 250K lignes, compilées avec Microsoft VC++ 10 (Visual Studio 2010). Le code utilise également BOOST_FOREACH de la bibliothèque boost. Je suis en train d'essayer le VC++ 11 (Visual Studio 2012 RC) qui implémente aussi la méthode basée sur l'intervalle. for boucle avec le auto .

Jusqu'à présent, j'ai rencontré la situation où l'élément était déclaré en dehors de l'élément BOOST_FOREACH (pas de déclaration dans les parenthèses) :

BOOST_FOREACH (element, container) {
    ...
}

... et le element était censé avoir la valeur définie dans la boucle après la fonction break . Pouvez-vous vous souvenir d'une situation similaire problèmes ?

Lorsque le BOOST_FOREACH contient la déclaration, choisiriez-vous de remplacer le type explicite par auto ? Y a-t-il un avantage à le faire alors que l'on réécrit simplement et mécaniquement la BOOST_FOREACH au lieu de laisser la déclaration explicite à cet endroit ?

Merci pour votre aide, Petr

4voto

ecatmur Points 64173

L'avantage de auto par rapport à l'utilisation du type réel ou du type de référence est que le code continuera à fonctionner si le type du conteneur change. Ce n'est peut-être pas ce que vous voulez si vous effectuez intentionnellement une conversion de type sur le résultat de l'itération indirecte de l'itérateur du conteneur.

Exemple :

std::vector<int> v;
for (int i: v) ...

Si v les changements apportés à std::vector<long> o std::vector<unsigned> alors la conversion de type peut être indésirable ; néanmoins, un avertissement du compilateur devrait le signaler (en particulier pour une conversion restrictive). D'un autre côté, vous pouvez avoir un code où une conversion (d'élargissement) est prévue :

std::vector<char> v;
for (int i: v) ...

1voto

Jonathan Wakely Points 45593

choisiriez-vous de remplacer le type explicite par le type automatique ?

Oui, mais si le type est par ex. int& alors je le remplacerais par auto& sinon le type déduit ne sera pas une référence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X