11
votes

Création d'un type composite de deux classes enum, prête pour la carte STL

Je voudrais créer un type composite sur deux classes Enum CODE>.

enum class Color {RED=0, GREEN=1, BLUE=2};
enum class Shape {SQUARE=0, CIRCLE=1, TRIANGLE=2};


3 commentaires

Autant que je sache, la situation Enum n'a pas changé en C ++ 11.


Pourquoi avez-vous besoin d'aplatir? Ce n'est pas une exigence pour std :: map , qui nécessite simplement une ordonnance faible stricte. Vous pouvez facilement faire cela avec des comparaisons imbriquées.


Opérateur << / Code> n'est requis que s'il va être la touche dans la carte , pas si c'est la valeur. En supposant que c'est la clé, pourquoi ne pas donner couleur ou forme prime dans le comparateur? Il n'est pas moins significatif que l'opérateur posté << / code>.


6 Réponses :


2
votes

C'est une bonne question, mais vous ne avez pas besoin le nombre de couleur pour les comparer: xxx


0 commentaires

4
votes

Vous n'avez pas besoin d'index linéaire, vous pouvez simplement les comparer lexicographiquement:

friend bool operator< (const Object &lhs, const Object &rhs) {
  if (lhs.color < rhs.color) return true;
  else if (lhs.color > rhs.color) return false;
  else return lhs.shape < rhs.shape;
}


0 commentaires

2
votes

Ce que vous essayez d'exprimer est de déterminer l'ordre de vos objets, vous devez d'abord comparer la couleur, puis vérifier la forme au cas où la couleur était la même. Au lieu de linéariser cela, si vous utiliseriez simplement des opérateurs booléens.

friend bool operator< (const Object &lhs, const Object &rhs) {
  return 10000*lhs.color+lhs.shape < 10000*rhs.color+rhs.shape;
}


0 commentaires

2
votes

Il vous suffit de comparer de forme si couleur est identique pour les deux.

Utilisation d'un ternaire, vous pouvez le faire aussi bien: < Pré> xxx


0 commentaires

15
votes

Comme commenté et comme indiqué déjà par d'autres, donnez la priorité à ou couleur dans l'opérateur << / code> et comparez uniquement l'autre si Le premier est égal. Une mise en œuvre alternative pour opérateur << / code> à l'aide de std :: cravate : xxx


0 commentaires

7
votes

Considérons en utilisant simplement std :: tuple comme "Composite Enum". Cela viendra avec des opérateurs de comparaison déjà définis pour vous, en utilisant un ordre de dictionnaire. Par exemple, code valide: xxx


0 commentaires