具有作用域枚举的 QFlags 的相等运算符
Equality operator for QFlags with scoped enum
我使用范围枚举定义了一些标志,如下所示:
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<int>(NoCapabilities)
) 可行,但它真的很难看。
解决这个问题的方法是什么?
0 零值并测试它是一种不好的做法吗?
您可以为您的数据类型组合重载相等运算符。然而演员仍然是必要的,但被运营商隐藏了。
#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;
}
我使用范围枚举定义了一些标志,如下所示:
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<int>(NoCapabilities)
) 可行,但它真的很难看。
解决这个问题的方法是什么? 0 零值并测试它是一种不好的做法吗?
您可以为您的数据类型组合重载相等运算符。然而演员仍然是必要的,但被运营商隐藏了。
#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;
}