0
votes

Pourquoi les valeurs de classes de type INum ne peuvent-elles pas être utilisées comme int

Je voulais changer un ancien style Enum code> à Enum Classe: int code> en raison de sa propre portée.

Mais le compilateur se plaint de l'utilisation des valeurs en Integer arithmétiques. Mais pourquoi, puisque l'énum est explicitement tapé comme int? P>

Exemple: P>

  enum class MsgType : int {
    Output = 1,
    Input  = 2,
    Debug  = 3
  };
  enum class MsgSender : int {
    A = 1,
    B = 2,
    C = 3
  };


  // later in code
  int id = (MsgType::Input << 16) + (MsgSender::A);


5 commentaires

Avez-vous essayé de lancer avant de changer? Il n'y a probablement aucun opérateur de changement de vitesse sur un énumé.


Parce que c'est toujours une classe , pas un int . C'est le point de enum class , c'est un type dédié et non seulement un alias pour un entier


Désolé, mais c'est il semble illocigal que vous passez à une énorme énumé et que vous vous attendez à ce que ce ne soit pas typique. C'est la principale différence entre les nouveaux et les vieux énums


@Unholysheep je voudrais comparer une valeur d'énorme plus à un objet puisqu'il est utilisé comme un. et dans ce cas, un objet d'une classe qui est dérivé de int


Oui, la syntaxe est similaire. Mais non, cela ne signifie pas la même chose. Malheureux, mais rien vraiment Noverl.


4 Réponses :


6
votes

C'est la fonctionnalité. Les énumérations scopées ne sont pas implicitement convertibles aux entiers, vous ne pouvez donc pas les utiliser au lieu d'entiers. Ils sont fortement typés par design. Si vous veux em> la conversion implicite, utilisez des énumérations non copédées.

int operator<<(MsgType, int); // etc


0 commentaires

2
votes

Type Safety est la principale raison d'utiliser les nouveaux énumérums carsés (peut-être que le nom est un peu trompeur). Si vous voulez simplement une énumération qui est scopée et que vous pouvez convertir implicitement en entiers, vous pouvez l'envelopper dans un espace de structure ou de noms:

struct MsgSender {
   enum Values {
      A = 1,
      B = 2,
      C = 3
   };
};


0 commentaires

2
votes

Vous pouvez les convertir explicitement via un statique_cast.

  int id = (static_cast<uint32_t>(MsgType::Input) << 16) + (static_cast<uint32_t>(MsgSender::A)) ;


0 commentaires

1
votes

Vous ne pouvez pas utiliser C ++ 11 Enums Scoped directement sous forme d'int, mais peut le jeter dans Int .

Principalement en raison de la raison de la sécurité de type, l'énum dégagée peut éventuellement des noms à l'intérieur de l'ENUMS, et la DOEST ENUM SCOPED n'a pas de risque de nom de fuite, les noms ne peuvent être visibles qu'à l'intérieur.

Il y a 2 types d'énums en C ++ jusqu'à présent.

C ++ 98-Style non calculé Enums: Enum couleur {rouge, vert, jaune}; , qui peut convertir implicite en int.

C ++ 11 EMPARUMS SCOPED: Enum Classe {rouge, vert, jaune}; , Ce qui ne peut pas être converti implicite en Int, ne peut utiliser qu'un casting pour convertir en un autre type, comme static_cast (my_Color) . .

Les énumes SCOPED ont 3 avantages comparant aux énumjets non copés:

  1. Réduire la pollution des espaces de noms;
  2. Sécurité de type forte;
  3. Enums Scoped Scoped peut être avancé, non cotisé Enums a besoin d'un travail additionnel à avancer;

    Pendant ce temps, des énums non cessés sont plus flexibles que les énumes scopées.

    Spécification des supports d'énums et d'énums non copérés de type Spécification du type sous-jacent, le type de sous-jacent par défaut pour encadré Enums est int . Enums non copédés n'a pas de type sous-jacent par défaut, qui est dépendant du compilateur, peut être un char ou int , en fonction de la plage de valeurs.

    Enum Class Color: STD :: uint8_t {rouge, vert, jaune}; // définition

    Enum couleur: STD :: uint8_t {rouge, vert, jaune}; // déclaration avant

    Enums non copérés ne peut être avancé que si la déclaration sepcier un type sous-jacent.

    Dans la pratique, préférez-vous énormément d'énumérations non calculées.

    Voir le livre "Efficace moderne C ++" de Scott Meyers, point 10: Préférez des énumérations encombrées à des énums non calculés.


1 commentaires

Bonjour, désolé pour mon erreur, mon 4ème article est incorrect. Je l'ai modifié.