Devo usar #define, enum ou const?

Em um projeto C ++ em que estou trabalhando, tenho umbandeira tipo de valor que pode ter quatro valores. Essas quatro bandeiras podem ser combinadas. Sinalizadores descrevem os registros no banco de dados e podem ser:

novo recorderegistro excluídoregistro modificadoregistro existente

Agora, para cada registro eu desejo manter este atributo, então eu poderia usar um enum:

enum { xNew, xDeleted, xModified, xExisting }

No entanto, em outros lugares no código, preciso selecionar quais registros devem ficar visíveis para o usuário, então gostaria de poder passar isso como um único parâmetro, como:

showRecords(xNew | xDeleted);

Então, parece que eu tenho três possíveis abortos:

#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;
}

Os requisitos de espaço são importantes (byte vs int), mas não são cruciais. Com define eu perco a segurança do tipo, e comenum Eu perco algum espaço (inteiros) e provavelmente tenho que converter quando quero fazer uma operação bit a bit. Comconst Eu acho que também perco tipo de segurança desde um aleatóriouint8 poderia entrar por engano.

Existe alguma outra maneira mais limpa?

Se não, o que você usaria e por quê?

P.S. O resto do código é bastante limpo e moderno C + + sem#defines, e eu usei namespaces e templates em poucos espaços, então eles também não estão fora de questão.

questionAnswers(2)

yourAnswerToTheQuestion