简而言之,现代行业接受的在 C++ 中进行位掩码的方式是什么?更具体地说,您如何处理函数声明中的多个和可变数量的选项?
即假设您有一个带有可选和可变参数的函数,以及传递给系统调用的标志。
不,位掩码的工作方式与它们在 C 中的工作方式相同。
通过一些工作,与普通的类 C 位掩码相比,您可以获得一些额外的类型安全性。
#include <type_traits>
enum class MyOpts {
OPT1 = 1<<0,
OPT2 = 1<<1,
OPT3 = 1<<2,
OPT_ALL = OPT1 | OPT2 | OPT3
};
#define MYOPTS_BINARY_OP(OP) \
inline MyOpts operator OP(MyOpts a, MyOpts b) { \
using num_type = std::underlying_type<MyOpts>::type; \
return static_cast<MyOpts>( static_cast<num_type>(a) OP \
static_cast<num_type>(b) ); \
} \
inline MyOpts& operator OP ## = (MyOpts& a, MyOpts b) { \
a = a OP b; \
return a; \
}
MYOPTS_BINARY_OP( | )
MYOPTS_BINARY_OP( & )
MYOPTS_BINARY_OP( ^ )
#undef MYOPTS_BINARY_OP
inline MyOpts operator~(MyOpts opts) {
return static_cast<MyOpts>(
~static_cast<std::underlying_type<MyOpts>::type>(opts) & OPT_ALL );
}
每当我创建位掩码时,我通常会做这种事情,但我不能说我已经将其视为“行业接受”。