Permettre de Gamme Pour les à énumérer les classes?

J'ai un récurrentes morceau de code où je boucle sur tous les membres d'une enum class.

La for boucle que j'utilise actuellement a l'air très difficile par rapport à la nouvelle range-based for.

Est-il possible de prendre avantage de la nouvelle C++11 caractéristiques de couper vers le bas sur le niveau de verbosité pour mon for boucle?

Code actuel que j'aimerais améliorer:

enum class COLOR
{
    Blue,
    Red,
    Green,
    Purple,
    First=Blue,
    Last=Purple
};

inline COLOR operator++( COLOR& x ) { return x = (COLOR)(((int)(x) + 1)); }

int main(int argc, char** argv)
{
  //any way to improve the next line with range-based for?
  for( COLOR c=COLOR::First; c!=COLOR::Last; ++c )
  {
    //do work
  }
  return 0;
}

En d'autres termes, il serait bien si je pouvais faire quelque chose comme:

for( const auto& c : COLOR )
{
  //do work
}
  • Intéressant. Ada avait cette fonction depuis 1983.
  • (COLOR)(((int)(x) + 1)) Au lieu de int, pensez à utiliser std::underlying_type<COLOR>::type.
  • Est-il prévu que le Violet est ignorée?
  • pour un grand bout - a essayé de #include <type_traits>, mais des problèmes de compilation de gcc 4.6.1 - va enquêter sur les en-têtes.
  • std::underlying_type est ce n'est pas pris en charge sur GCC 4.6. Il sera pris en charge sur 4.7. Il y a une évaluation approximative de l'émulation ici: stackoverflow.com/a/7932617/46642.
  • merci encore une fois!
  • Gah! si vite à l'accepter. J'ai l'habitude d'attendre 24 heures juste pour donner à tous les fuseaux horaires une chance de trouver une meilleure réponse.
  • Ce dont nous avons besoin est quelque chose comme les "valeurs de () la méthode de Java a pour ses énumérations. Cela pourrait retourner une sorte de jeu ou de la carte conteneur qui peut être itéré. Ce conteneur peut être calculée au moment de la compilation à l'aide de modèles.
  • Si vous voulez un coup de pouce de la solution, voir boost.2283326.n4.nabble.com/... '[Plage][Itérateur] itérer sur une énumération? '

InformationsquelleAutor kfmfe04 | 2011-12-14