我在网上找不到任何有关如何使用此方法的资源,该方法在图书馆中使用非常广泛。
我指的是这样的东西:
someFun(Class::prop1 | Class::prop2 | Class::prop3, somethingelse);
现在,我无法理解这是基于2的幂的枚举/整数,所以类似:class Class{
public
enum{prop1 = 1, prop2 = 2, prop3 = 4, prop4 = 8};
};
然后使用this之类的东西来检查第n位是0还是1,但是有没有办法以一种更简洁的方式来做到这一点?如果您愿意,可以使用以下示例:
class Class{
public:
enum{prop1 = 1, prop2 = 2, prop3 = 4};
void f(int i){
if( ... ) ...
}
};
我在想也许使用&
运算符,例如if(i & Class::prop1) ...
,但是使用idk是正确的方法
最佳答案
您的示例是正确的,并且遵循使用枚举的经典C样式位集。或者,您可以使用左移来声明枚举成员,这可能会提高不熟悉的人的可读性:
enum Flags {
flag0 = 1<<0,
flag1 = 1<<1,
flag2 = 1<<2
};
flags & flag0
在if条件中起作用的原因是,如果整数为0,则该条件仅对整数进行求值为false。在按位AND运算中,其中一个操作数为2的幂,这意味着另一个操作数中未设置特定位。一种替代方法是使用隐式值声明您的枚举:
enum class MyFlags {
flag0, flag1, flag2 // implicit values are consecutive, starting with 0
};
然后直接或通过新类型使用std::bitset
:class MyBitset {
public:
explicit MyBitset(std::initializer_list<MyFlags> flags) {
for (MyFlags f : flags)
values.set(static_cast<unsigned>(f));
}
bool test(MyFlags f) { return values.test(static_cast<unsigned>(f); }
private:
std::bitset<WIDTH> values; // see below
};
优点是,现在您可以使用初始化器列表构造一组标志,类似于STL:MyBitset({MyFlags::flag0, MyFlags::flag2})
这种选择的问题是最大值。理想情况下,我们将设置位宽,使其具有足够的容量以容纳最大的标志值。我们可以使用类型特征来指定它,然后MyBitset
可以是通用的:template <class T> struct MyLimits;
template <> struct MyLimits<MyFlags> {
static constexpr bool isEnum = true;
static constexpr size_t min = static_cast<size_t>(Flags::flag0);
static constexpr size_t max = static_cast<size_t>(Flags::flag2);
};
// fails if MyLimits was not specialized for MyFlags
std::bitset<MyLimits<MyFlags>::max> values;
关于c++ - C++使用位OR运算符枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63338177/