Visual c++ “pour chaque” portabilité
J'ai tout récemment découvert que Visual C++ 2008 (et peut-être des versions antérieures?) prend en charge for each
de la syntaxe stl listes et al afin de faciliter l'itération.
Par exemple:
list<Object> myList;
for each (Object o in myList)
{
o.foo();
}
J'ai été très heureux de la découvrir, mais je suis inquiet au sujet de la portabilité pour le jour tant redouté lorsque quelqu'un décide j'ai besoin d'être en mesure de compiler mon code en dire, gcc ou une autre compilateur. Est-ce la syntaxe largement pris en charge et que je peux l'utiliser sans se soucier des problèmes de portabilité?
Vous devez vous connecter pour publier un commentaire.
Pour chaque n'est pas de série C ou C++, la syntaxe. Si vous voulez être en mesure de compiler ce code dans gcc ou g++, vous aurez besoin de créer un itérateur et l'utilisation d'un standard pour la boucle.
QuantumPete
[modifier]
Cela semble être une nouvelle fonctionnalité introduite dans MS Visual C++, donc ce n'est certainement pas portable. Ref: http://msdn.microsoft.com/en-us/library/xey702bw%28VS.80%29.aspx [/edit]
Je ne voudrais pas l'utiliser. Alors qu'il est tentant de fonction, la syntaxe est incompatible avec la prochaine C++0x standard, qui utilise:
de faire la même chose.
Il est un très bon portable alternative: Coup de pouce.Foreach. Juste dump cet en-tête dans votre projet et vous pouvez écrire vos boucles comme suit:
Si vous souhaitez utiliser un foreach et dans le même temps, vous ne voulez pas ajouter des supplémentaires de dépendance (comme Boost) - cette macro va vous aider à:
Visual C++ "pour chaque" n'est pas en C++ standard, ce qui signifie que vous ne serez pas en mesure de compiler votre code sur d'autres compilateurs tels que g++. Cependant, la STL propose std::for_each, mais sa syntaxe est beaucoup moins intuitif. Voici son prototype:
Il prend deux itérateurs de la définition d'une plage valide, et applique la fonction unaire (ou foncteur) f pour chaque objet dans cette gamme.
Vous pouvez réécrire votre exemple d'utilisation de std::for_each comme ceci:
Cependant, si vous souhaitez rester à proximité de la classique de la syntaxe de la pour chaque construction, et si vous êtes ok sur l'utilisation de Boost, vous pouvez utiliser Coup de pouce.FOREACH, qui vous permettra d'écrire
La Bibliothèque Boost a un portable ForEach de réalisation.
Votre code n'est pas portable.
Les ouvrages suivants, avec le C++ 0x standard et Visual C++ 2010 (qui ne prend pas en charge le nouveau "allait de" syntaxe autant que j'en puis dire).
Maintenant, vous pouvez écrire:
Comparez cela à la BOOST_FOREACH code de macro à http://www.boost.org/doc/libs/1_48_0/boost/foreach.hpp qui n'est pas seulement complexe il dispose également d'un certain nombre de dépendances sur d'autres bibliothèques boost.
Je recommande également BOOST_FOREACH. J'ai l'habitude de créer une macro, le long des lignes de:
Ce qui tend à augmenter la lisibilité. Vous devez être prudent sur les collisions avec d'autres foreach implémentations bien. Par exemple, Qt fournit un "foreach" et il y a std::for_each.
Je trouve que le std::for_each ne fait pas gagner beaucoup de temps puisque vous vous faites beaucoup de désactiver la fonction des objets de fournir de l'appel for_each. Il est généralement tout aussi rapide pour faire de norme pour la boucle à l'aide de STL itérateurs.
Mon vote va pour Luc,
En tenir à la norme STL algorithmes et vous permettra de mieux, et de loin. Les algorithmes de la STL peut faire de votre vie très facile, efficace et sécuritaire. Jetez un œil au large de la mettre en veilleuse les algorithmes comme find_if, le comte, count_if, de tri, de transformation, etc...
Point à partir de 5...
http://www.sgi.com/tech/stl/table_of_contents.html
Boost est cool, mais si vous allez l'utiliser juste pour le FOR_EACH macro, c'est trop lourd en matière de développement/environnement de construction de l'installation.
utiliser boost lorsque la norme c++ /stl ne peut pas résoudre le problème dans un 'simple' façon.