首页 > 解决方案 > 不断的“旗帜”被认为是好的风格吗?(c++)

问题描述

我目前正在一个图书馆工作,我想知道拥有全大写常量是否被认为是一种很好的风格,例如:

constexpr int ONLY_LOWERCASE = 1;
constexpr int ONLY_UPPERCASE = 2;

等等。我计划使用它来让库用户控制函数的行为,例如:

doSomeThing(var, ONLY_UPPERCASE);+

谢谢

标签: c++oopstylesc++17

解决方案


似乎您正在使用整数结构来存储布尔数据。出于内存使用的原因,它可能被认为是为此目的使用布尔结构的更好方法。

存档此目标的一种方法是使用enumenum class继承自bool

enum class string_case : bool {
    ONLY_LOWERCASE,
    ONLY_UPPERCASE
}

这样,您将使用单个字节来指示您想要的任何内容,而不是示例中的 8 个字节。

使用示例:

doSomeThing(var, string_case::ONLY_UPPERCASE);

编辑

如果您有超过 2 个标志,您仍然可以使用enum(只是没有继承自bool):

enum class string_case {
    ONLY_LOWERCASE = 1,
    ONLY_UPPERCASE = 2,
    FLAG_3 = 3,
    FLAG_4 = 4
};

即便如此,仅使用 4 个字节(而不是4(bytes) * flags_count)。
另一种方法,如果多个标志可以一起打开(并且您不想在enum计算中使用位),您可以使用结构:

struct options {
    bool option_1: 1;
    bool option_2: 1;
    bool option_3: 1;
    bool option_4: 1;
};

通过这种方式,您将只使用存储这些位所需的字节数。


推荐阅读