Comment recuperez le nombre d'element d'un enum ?

Comment recuperez le nombre d'element d'un enum ? - C++ - Programmation

Marsh Posté le 17-05-2016 à 03:14:11    

Bonjour,

Code :
  1. class Locator {
  2.   enum class services : int {
  3.     foo, bar, yolo
  4.   };
  5.   /* ... */
  6. };


 
En essayant ceci :

Code :
  1. std::array<std::unique_ptr<IService>, sizeof(Locator::services)> Services;


 
Le problème c'est que le sizeof me renvoi un size_t de 4 octets, ce qui correspond la taille d'un int, : int et non à mes 3 éléments.  
 
Le sizeof sur un objet n'est il pas sensé renvoyer la taille de l'objet en octet ? Un enum scoper n'est il pas un objet ?  
 
 
Autre problème que je n'arrive pas a trouver, dans ces déclarations :  
 

Code :
  1. int val1:2;
  2. bool val2:1;
  3. int val1:3;


 
Que signifie ces deux points ?


---------------
The success, is a progressive realization of a worthy ideal
Reply

Marsh Posté le 17-05-2016 à 03:14:11   

Reply

Marsh Posté le 17-05-2016 à 07:47:52    

Bonjour !
 
Pour les énumérés, sauf erreur de ma part ou ajout dans la nouvelle mouture, on ne peut pas.
 
Pour la deuxième notation, dans une structure, c'est ce qu'on appelle des champs de bits. Dans l'exemple ci-dessus, cela donne :  
val1 : entier signé sur 2 bits (entre -2 et 1)
val2 : booléen stocké sur un bit (ce qui suffit largement),
val1 : entier signé sur 3 bits (entre -4 et 3).
 
Ce n'est pas forcément conseillé de les utiliser par pas mal de règles de programmation, la façon dont les données sont stockées en mémoire dépend du bon vouloir du compilateur, mais cela permet de gagner de la place en mémoire.
 
Bonne continuation !


---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 17-05-2016 à 12:10:16    

Qand tu fais la déclaration enum class services : int {...}, tu dis que ton enum aura pour taille celle d'un int. Il est donc normal que sizeof te renvoie la taille d'un int.
Il n'y a pas de moyen standard sinon.
 
En boost, il y a une astuce basée sur le préprocesseur:
#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/size.hpp>
 
#define DEFINE_NEW_ENUM(Type_, Values_)\
  typedef enum { BOOST_PP_SEQ_ENUM(Values_) } Type_;\
  size_t count(Type_) { return BOOST_PP_SEQ_SIZE(Values_); }
 
Et donc quand tu définis ton enum avec DEFINE_NEW_ENUM, la macro définit aussi la fonction count avec pour paramètre un enum de ce type, qui renvoie le nb d'elts (BOOST_PP_SEQ_SIZE(Values_) ne fait que compter le nb d'elements de Values_).
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-05-2016 à 18:27:38    

Code :
  1. enum class Services
  2. {
  3.   foo,
  4.   bar,
  5.   baz,
  6.   Count
  7. };


 
de rien :o


---------------
last.fm
Reply

Marsh Posté le 18-05-2016 à 03:16:52    

[:crevetteman:5]  
 
Toi tu mérites ton titre d’ingénieur  :jap:  
 
Et merci également aux autres.


---------------
The success, is a progressive realization of a worthy ideal
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed