Je voulais changer un ancien style 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 code> à
Enum Classe: int code> en raison de sa propre portée.
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);
4 Réponses :
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
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 }; };
Vous pouvez les convertir explicitement via un statique_cast.
int id = (static_cast<uint32_t>(MsgType::Input) << 16) + (static_cast<uint32_t>(MsgSender::A)) ;
Vous ne pouvez pas utiliser C ++ 11 Enums Scoped directement sous forme d'int, mais peut le jeter dans 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. P>
Il y a 2 types d'énums en C ++ jusqu'à présent. P>
C ++ 98-Style non calculé Enums:
C ++ 11 EMPARUMS SCOPED: Les énumes SCOPED ont 3 avantages comparant aux énumjets non copés: p>
Pendant ce temps, des énums non cessés sont plus flexibles que les énumes scopées. P>
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 Enums non copérés ne peut être avancé que si la déclaration sepcier un type sous-jacent. P>
Dans la pratique, préférez-vous énormément d'énumérations non calculées. P>
Voir le livre "Efficace moderne C ++" de Scott Meyers, point 10: Préférez des énumérations encombrées à des énums non calculés. P> Int Code>. P>
Enum couleur {rouge, vert, jaune}; code>,
qui peut convertir implicite en int. p>
Enum Classe {rouge, vert, jaune}; code>,
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
int code>. 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 code> ou
int code>, en fonction de la plage de valeurs. P>
Enum Class Color: STD :: uint8_t {rouge, vert, jaune}; // définition code> p>
Enum couleur: STD :: uint8_t {rouge, vert, jaune}; // déclaration avant code> p>
Bonjour, désolé pour mon erreur, mon 4ème article est incorrect. Je l'ai modifié.
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
code>, pas un
int code>. C'est le point de
enum class code>, 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 code>
Oui, la syntaxe est similaire. Mais non, cela ne signifie pas la même chose. Malheureux, mais rien vraiment Noverl.