10
votes

Boost_foreach & modèles sans typef

Quand je travaille avec Boost_Foreach, il n'y a pas de problème avec des modèles simples comme vecteur. Mais lorsque j'essaie d'itération via la carte>, par exemple, j'ai besoin de tapeDef le type d'élément.

Y a-t-il une solution de contournement?


0 commentaires

4 Réponses :


12
votes

Il y a un problème car il s'agit d'une macro, et donc ne peut donc pas gérer les types contenant des virgules (le préprocesseur ne connaît pas les modèles).

Vous pouvez également déclarer la variable avant la boucle, voir Documentation . P>

typedef std::pair<const int, double> MyPair;
//or
typedef std::map<int, double>::value_type MyPair;

BOOST_FOREACH(MyPair& ref, my_map) { ... }


2 commentaires

Vous devriez probablement faire ça: std :: map :: valow_type


Également en C ++ 11; Boost_foreach (auto & ref, my_map) {...}



6
votes

boost_foreach_pair est une autre option qui fonctionne bien dans notre expérience:

http://lists.boost.org/archives/boost/ 2009/09/156345.PHP

http://lists.boost.org/archives/boost/ 2009/09/156366.php


0 commentaires

9
votes

Si vous avez besoin de itération sur une carte, le moyen le plus simple consiste à utiliser des tuples, car obtenir le type correct pour Typef, est gênant. Voici comment utiliser les tuples:

BOOST_FOREACH(tie(key, value), my_map) { ... } //This will work


3 commentaires

La virgule entre la clé et la valeur va confondre le préprocesseur.


@Ferruccio La virgule entre la clé et la valeur sera pas confondre le pré-processeur en raison de la parenthèse autour de la clé et de la valeur. De plus, je le fais tout le temps quand j'ai besoin de faire une carte.


Je n'avais aucune idée que vous pouviez faire cela avec le pré-processeur.



2
votes

Ceci peut être aussi simple que ceci: xxx pré>

à l'aide de la norme C ++ 11, automatique est comme VaR en C #, il fera P>

BOOST_FOREACH(std::pair<int, double>& p, my_map) { ... }


0 commentaires