具有作用域枚举的 QFlags 的相等运算符

Den*_*aud 5 enums flags qt c++11

我使用范围枚举定义了一些标志,如下所示:

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

现在,我尝试使用相等运算符:

Capabilities(DataCapability::NoCapabilities) == Capability::NoCapabilities
Run Code Online (Sandbox Code Playgroud)

testFlag我无法在当前示例中使用,因为NoCapabilities = 0. 如果枚举没有作用域(删除class关键字),则此方法有效。

显然,转换为 int ( static_cast<int>(NoCapabilities)) 是可行的,但它真的很难看。

解决这个问题的方法是什么?使用 0 零值并进行测试是一种不好的做法吗?

小智 3

您可以为数据类型组合重载相等运算符。然而,强制转换仍然是必要的,但被操作员隐藏了。

#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;
}
Run Code Online (Sandbox Code Playgroud)