В проекте C ++, над которым я работаю, у меня есть значение flag , которое может иметь четыре значения. Эти четыре флага могут быть объединены. Флаги описывают записи в базе данных и могут быть:
- новая запись
- удалённая запись
- измененная запись
- существующая запись
Теперь для каждой записи я хочу сохранить этот атрибут, чтобы я мог использовать перечисление:
enum { xNew, xDeleted, xModified, xExisting }
Однако в других местах кода мне нужно выбрать, какие записи должны быть видны пользователю, поэтому я хотел бы иметь возможность передавать это как один параметр, например:
showRecords(xNew | xDeleted);
Итак, у меня есть три возможных подхода:
#define X_NEW 0x01
#define X_DELETED 0x02
#define X_MODIFIED 0x04
#define X_EXISTING 0x08
или
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
или
namespace RecordType {
static const uint8 xNew = 1;
static const uint8 xDeleted = 2;
static const uint8 xModified = 4;
static const uint8 xExisting = 8;
}
Требования к пространству важны (byte vs int), но не важны. С определениями я теряю безопасность типов, а с enum
я теряю некоторое пространство (целые числа) и, вероятно, вынужден приводить, когда я хочу сделать битовую операцию. С const
я думаю, что я также теряю безопасность типов, поскольку случайный uint8
мог попасть по ошибке.
Есть ли какой-нибудь другой более чистый способ?
Если нет, что бы вы использовали и почему?
P.S. Остальная часть кода - довольно чистый современный C ++ без #define
s, и я использовал пространства имен и шаблоны в нескольких местах, так что о них тоже не может быть и речи.