Оператор равенства для QFlags с ограниченным перечислением - PullRequest
2 голосов
/ 19 июня 2019

У меня есть несколько флагов, определенных следующим образом, с использованием перечисления с областью видимости:

enum class Capability : int
{
  NoCapabilities  = 0,
  SomethingCool = 1,
  UberCool = 1 << 1,
  EvenCooler = 1 << 2,
};
Q_DECLARE_FLAGS( Capabilities, Capability )

Теперь я пытаюсь использовать оператор равенства:

Capabilities(DataCapability::NoCapabilities) == Capability::NoCapabilities

Я не могу использовать testFlag в текущем примере, начиная с NoCapabilities = 0.Это работает, если enum не ограничен (удаление ключевого слова class).

Очевидно, приведение к int (static_cast<int>(NoCapabilities)) работает, но это действительно уродливо.

Каков подход крешить это?Плохо ли иметь нулевое значение 0 и проверять его?

1 Ответ

3 голосов
/ 19 июня 2019

Вы можете перегрузить оператор равенства для вашей комбинации типов данных. Однако приведение еще необходимо, но оператор скрыт.

#include <QCoreApplication>
#include <QFlags>
#include <iostream>

enum class Capability : int
{
    NoCapabilities = 0,
    SomethingCool  = 1,
    UberCool       = (1 << 1),
    EvenCooler     = (1 << 2),
};
Q_DECLARE_FLAGS(Capabilities, Capability)

template <typename T>
bool operator==(const QFlags<T> lhs, const Capability rhs)
{
    return (QFlags<T>::Int(lhs) == static_cast<int>(rhs));
}

int main(int argc, char *argv[])
{
    Q_UNUSED(argc);
    Q_UNUSED(argv);

    if (Capabilities(Capability::NoCapabilities) == Capability::NoCapabilities)
    {
        std::cout << "true" << std::endl;
    }
    else
    {
        std::cout << "false" << std::endl;
    }

    if (Capabilities(Capability::EvenCooler) == Capability::NoCapabilities)
    {
        std::cout << "true" << std::endl;
    }
    else
    {
        std::cout << "false" << std::endl;
    }

    return 0;
}
...