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};
6 Réponses :
C'est une bonne question, mais vous ne em> avez pas besoin em> le nombre de couleur code> pour les comparer:
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; }
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; }
Il vous suffit de comparer Utilisation d'un ternaire, vous pouvez le faire aussi bien: P> < Pré> xxx pré> p> de forme code> si
couleur code> est identique pour les deux.
Comme commenté et comme indiqué déjà par d'autres, donnez la priorité à code> code> ou couleur code> 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 code >
:
Considérons en utilisant simplement std :: tuple
Autant que je sache, la situation
Enum code> n'a pas changé en C ++ 11.
Pourquoi avez-vous besoin d'aplatir? Ce n'est pas une exigence pour
std :: map code>, 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
code>, pas si c'est la valeur. En supposant que c'est la clé, pourquoi ne pas donner
couleur code> ou
forme code> prime dans le comparateur? Il n'est pas moins significatif que l'opérateur
posté << / code>.