c++ - 方便的标志处理,其中所有标志都不能适应 64 位

标签 c++

我想用 C++ 创建一个方便的标志处理程序。

通常的想法是使用这样的东西:

enum class Flag {
    Foo = 1<<0,
    Bar = 1<<1,
    Baz = 1<<2
};

// these operators can be generalized by using template functions with SFINAE
Flag operator|(Flag a, Flag b) {
    return static_cast<Flag>(static_cast<underlying_type>(a)|static_cast<underlying_type>(b));
}
// add other operators here, like &, ^, |=, etc.

这行得通,但是我有两个问题:

  • Flag 的使用方式不一定是存储一个 标志,而是多个标志。这不是什么大问题,但我不认为这是好的设计,因为 Flag 现在实际上存储了一个未列为枚举成员的值。如果我将运算符的返回值更改为 underlying_type,那么我会丢失有关它存储 Flag
  • 标志的信息
  • 它无法扩展:如果我有超过 64 个标志,这个解决方案将不再有效

这个处理程序的进一步要求是不仅能够处理 1 位标志,而且能够处理几位宽的枚举(有了这些,很容易达到 64 位限制),我想控制位在处理程序之间的分配方式(我的意思是,例如,我想使用此处理程序来简化操作系统调用的处理,其中位位置由 API 确定)。

这个问题有什么(方便使用的、最佳的、通用的)解决方案?

最佳答案

只需使用 std::vector<bool>将标志存储为位(以这种方式实现)。如果位域的大小是固定的 - 使用 std::bitset .

关于c++ - 方便的标志处理,其中所有标志都不能适应 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46909737/

相关文章:

c++ - OpenGL 中一致的手绘线

c++ - 如何在 MFC 中设置菜单项旁边的复选标记?

c++ - 如何执行用c++编写的程序的运行时间?

c++ - 优化器 : replace const reference with const object

c++ - 在 C++ 中为具有默认参数的类查找模板的大小

java - TInyOS 1.x 编译 BLINK 时产生错误

c++ - [MIDL]如何在idl文件中使用c/c++头文件中声明的接口(interface)?

c++ - 应该在无指针类中声明/实现析构函数吗?

c++ - 使用 char* 而不是 string c++ 逐行读取文本文件

C++/JNI 大括号括起来的初始化程序映射 (Android NDK)