【问题标题】:Equality operator for QFlags with scoped enum具有范围枚举的 QFlags 的相等运算符
【发布时间】:2019-06-19 13:39:55
【问题描述】:

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

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。如果枚举没有作用域(删除 class 关键字),则此方法有效。

显然,转换为 int (static_cast&lt;int&gt;(NoCapabilities)) 有效,但它真的很难看。

解决这个问题的方法是什么? 将零值设为 0 并对其进行测试是一种不好的做法吗?

【问题讨论】:

    标签: qt c++11 enums flags


    【解决方案1】:

    您可以为您的数据类型组合重载相等运算符。然而演员仍然是必要的,但被运营商隐藏。

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 2018-04-24
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多