Dois-je utiliser des #define, enum ou const?

Dans un projet C++ je travaille, j'ai un drapeau type de valeur qui peut avoir quatre valeurs. Ces quatre indicateurs peuvent être combinés. Les drapeaux de décrire les enregistrements dans la base de données et peuvent être:

  • nouveau record
  • enregistrement supprimé
  • enregistrement modifié
  • enregistrement existant

Maintenant, pour chaque enregistrement, je souhaite garder cet attribut, donc je pourrais utiliser un enum:

enum { xNew, xDeleted, xModified, xExisting }

Cependant, dans d'autres endroits dans le code, j'ai besoin de sélectionner les enregistrements qui doivent être visibles pour l'utilisateur, donc je voudrais être en mesure de passer qu'un seul paramètre, comme:

showRecords(xNew | xDeleted);

Il me semble que j'ai trois appoaches:

#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 (byte vs int) mais pas indispensable. Avec les définit, je perds le type de sécurité et la enum je perds de l'espace (des entiers) et probablement d'avoir à jeter quand je veux faire une opération au niveau du bit. Avec const je pense que j'ai aussi perdre de sécurité de type depuis un hasard uint8 pourrait obtenir par erreur.

Est-il un autre moyen le plus propre?

Sinon, que ferais-tu et pourquoi?

P. S. Le reste du code est plutôt moderne et propre de C++ sans #defines, et j'ai utilisé les espaces de noms et des modèles dans quelques places, donc ceux qui ne sont pas de question non plus.