在C ++中用逻辑OR(“|”)分隔选项

时间:2017-08-18 15:33:42

标签: c++ bitflags

我知道在初始化fstream实例时可以添加选项,例如:

fstream file("filename.txt", ios::in | ios::out | ios::binary);

在这种情况下,有3个选项。 我有几个问题:

  1. 我应该如何在自己的功能中实现它?
  2. 我应该定义任何const值还是marcos?
  3. 如何解析选项并正确处理它们?

2 个答案:

答案 0 :(得分:3)

  

我应该如何在自己的功能中实现它?

将其设为bitmask type

  

位掩码类型支持有限数量的位掩码元素,这些位掩码元素是位掩码类型的不同非零值,因此对于任何对CiCjCi & Ci != 0Ci & Cj == 0。此外,值0用于表示空的位掩码,没有设置值。


  

我应该定义任何const值或宏吗?

这些值通常是表示2的连续幂的常数,即1,2,4,8,16等。

  

如何解析选项并妥善处理它们?

您永远不需要“解析”这些选项 - 您需要做的就是检查是否存在给定选项。您可以使用&运算符

执行此操作
openmode x = ios::in | ios::out;
if (x & ios::in) {
    ... // TRUE
}
if (x && ios::binary) {
    ... // False
}

答案 1 :(得分:3)

这些是位掩码。

  

我应该如何在自己的功能中实现它?

     

我应该定义任何const值还是marcos?

不需要宏。我更喜欢枚举:

namespace options {
    enum options_enum : unsigned {
        in       = (1u << 0),
        out      = (1u << 1),
        binary   = (1u << 2),
        whatever = (1u << 3),
    };
};
  

如何解析选项并妥善处理它们?

通过屏蔽:

bool in = option_argument & options::in;