Dans un projet C ++ sur lequel je travaille, j'ai une sorte d' indicateur de valeur qui peut avoir quatre valeurs. Ces quatre drapeaux peuvent être combinés. Les indicateurs décrivent les enregistrements de la base de données et peuvent être:
- nouvel enregistrement
- enregistrement supprimé
- enregistrement modifié
- enregistrement existant
Maintenant, pour chaque enregistrement, je souhaite conserver cet attribut, afin que je puisse utiliser une énumération:
enum { xNew, xDeleted, xModified, xExisting }
Cependant, à d'autres endroits dans le code, je dois sélectionner les enregistrements qui doivent être visibles par l'utilisateur, donc j'aimerais pouvoir le transmettre en tant que paramètre unique, comme:
showRecords(xNew | xDeleted);
Donc, il semble que j'ai trois approches possibles:
#define X_NEW 0x01
#define X_DELETED 0x02
#define X_MODIFIED 0x04
#define X_EXISTING 0x08
ou
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
ou
namespace RecordType {
static const uint8 xNew = 1;
static const uint8 xDeleted = 2;
static const uint8 xModified = 4;
static const uint8 xExisting = 8;
}
Les besoins en espace sont importants (octet vs int) mais pas cruciaux. Avec les définitions, je perds la sécurité de type, et avec enum
je perds de l'espace (entiers) et je dois probablement effectuer un cast quand je veux faire une opération au niveau du bit. Avec const
je pense que je perds aussi la sécurité de type car un aléatoire uint8
pourrait entrer par erreur.
Existe-t-il un autre moyen plus propre?
Sinon, qu'utiliseriez-vous et pourquoi?
PS Le reste du code est plutôt propre C ++ moderne sans #define
s, et j'ai utilisé des espaces de noms et des modèles dans quelques espaces, donc ceux-ci ne sont pas non plus hors de question.
enum RecordType : uint8_t
combine le type de sécurité deenum
avec la petite taille de uint8_t
, bien que vous deviez toujours fournir des opérateurs au niveau du bit.