Добавить класс для работы с энумероваными флагами

Иван Комиссаров
Иван Комиссаров

Что-типа такого:

enum class Flag {
     NoFlags = 0x0,
     SuperFlag = 0x1,
     MegaFlag = 0x2,
     UltraFlag = 0x4,
     Mask = 0x7
};

void f(const std::flags<Flag> &flag)
{
    if (flags & Flag::SuperFlag)
         printf("Has SuperFlag\n");
}

int main()
{
    std::flags<Flag> flags(Flag::MegaFlag);
    flags |= Flag::SuperFlag;

    f(flags); // ok
    f(Flag::MegaFlag | Flag::SuperFlag); // should be ok too
    f(10); // error
    f(SomeOtherEnum::SomeOtherFlag); // error

    return 0;
}

Пример такого класса есть в Qt: http://doc.qt.io/qt-5/qflags.html

Правда, в данный момент непонятно, как реализовать конструирование флагов от битового выражения с энумами.

4
рейтинг
1 комментарий
Sir-VestniK
> Правда, в данный момент непонятно, как реализовать конструирование флагов от битового выражения с энумами.

Я обычно определяю QFlags<my_enum> operator| (my_enum, my_enum) и его одного всегда хватает.

Идея обсуждалась как в группе рассылки future proposals пару раз. Может быть полезным почитать эти обсуждения чтобы учесть их в предложении:
1 groups.google.com/a/isocpp.org/d/topic/std-proposals/NBZXi_E67qg/discussion
2 groups.google.com/a/isocpp.org/d/topic/std-proposals/1RPxJSJ_0z8/discussion

P.S. У меня есть переносимый миленький шаблончик для подобных вещей: my-it-experiments.blogspot.ru/2015/11/blog-post.html методом копипасты таскаю его между разными проектами где нет Qt.
Sir-VestniK
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).