битовые флаги — разделение опций с помощью логического ИЛИ (& quot; | & quot;) в переполнении стека

Я знаю, что параметры могут быть добавлены при инициализации экземпляра fstream, например:

fstream file("filename.txt", ios::in | ios::out | ios::binary);

В этом случае есть 3 варианта.
У меня есть несколько вопросов:

  1. Как мне реализовать это в моей собственной функции?
  2. Должен ли я определить какие-либо значения const или Маркос?
  3. Как разобрать варианты и правильно с ними разобраться?

1

Решение

Как мне реализовать это в моей собственной функции?

Сделай это тип битовой маски:

Тип битовой маски поддерживает конечное число элементов битовой маски, которые являются различными ненулевыми значениями типа битовой маски, так что для любой пары Ci а также Cj, Ci & Ci != 0 а также Ci & Cj == 0, Кроме того, значение 0 используется для представления пустой битовой маски без установленных значений.

Должен ли я определить какие-либо значения const или макросы?

Значения обычно являются константами, представляющими последовательные степени двух, то есть 1, 2, 4, 8, 16 и т. Д.

Как разобрать варианты и правильно с ними разобраться?

Вам никогда не нужно «разбирать» эти параметры — все, что вам нужно сделать, это проверить, присутствует ли данный параметр или нет. Вы можете сделать это с & оператор:

openmode x = ios::in | ios::out;
if (x & ios::in) {
... // TRUE
}
if (x && ios::binary) {
... // False
}
3

Другие решения

Это битовые маски.

Как мне реализовать это в моей собственной функции?

Должен ли я определить какие-либо значения const или Маркос?

Нет необходимости в макросах. Я предпочитаю перечисления:

namespace options {
enum options_enum : unsigned {
in       = (1u << 0),
out      = (1u << 1),
binary   = (1u << 2),
whatever = (1u << 3),
};
};

Как разобрать варианты и правильно с ними разобраться?

По маскировке:

bool in = option_argument & options::in;
3

По вопросам рекламы [email protected]