c++ - 使用枚举使用按位参数组合的最佳实践?

标签 c++ enums state bitwise-operators

我正在实现一个显示在屏幕上的 View 。根据以下配置参数,只要屏幕尺寸发生变化, View 就会被定位和调整大小。

enum DLViewLayout
{
    DLViewLayoutSolo = 1,
    DLViewLayoutDual = 2
};
enum DLViewFixedHorizontalProperty
{
    DLViewFixedHorizontalPropertyWidth = 4, // View margins scale with the screen width.
    DLViewFixedHorizontalPropertyMargin = 8 // View width scales with the screen width.
};
enum DLViewFixedVerticalProperty
{
    DLViewFixedVerticalPropertyHeight = 16,
    DLViewFixedVerticalPropertyMargin = 32
};
enum DLViewHorizonalAlignment
{
    DLViewHorizonalAlignmentLeft = 64,
    DLViewHorizonalAlignmentCenter = 128,
    DLViewHorizonalAlignmentRight = 256
};
enum DLViewVerticalAlignment
{
    DLViewVerticalAlignmentTop = 512,
    DLViewVerticalAlignmentMiddle = 1024,
    DLViewVerticalAlignmentBottom = 2048
};

我想知道在什么情况下按位 OR 组合枚举值以传递 View 状态是有意义的。

int viewState = DLViewLayoutSolo | DLViewFixedHorizontalPropertyWidth | DLViewFixedVerticalPropertyMargin | DLViewHorizonalAlignmentCenter | DLViewVerticalAlignmentMiddle;  
// viewState = 1189

我希望类的用户配置所有参数。我该如何强制执行?

在类中,我可以通过按位 AND 组合状态来检索各个设置。

if (viewState & DLViewLayoutSolo)
{
  // Set up solo view layout.
}
else if (viewState & DLViewLayoutDual)
{
  // Set up dual view layout.
}

最佳答案

您想使用来自不同枚举的值组合标志?

永远不会成为最佳实践,事实上,我从未在任何实践中看到它,无论好坏。这样一来,除其他问题外,任何使用公开这些标志属性的实例的元素都必须知道,或者应该知道,它是来自这些不同 enum 类型的值的合并。

既然值是按顺序递增的,为什么不简单地使用一个由所有成员组成的恰当命名的枚举呢?

此外,如果我们在这里谈论 .NET(虽然合法,但分号告诉我可能不合法),这样的 enum 类型应该用 [Flags] 属性,但仍然只组合相同 enum 类型的值。

关于c++ - 使用枚举使用按位参数组合的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5780284/

相关文章:

haskell - 自然数序列生成器

state - 使用 PBS 在 super 计算机上暂停、保存到磁盘、重新启动长时间作业

c++ - 使用 Mutex 在 Windows 上与线程进行 IPC 连接

c++ - 循环后保留一个值

java - 重构 JUnit 测试以扩展多个方法和测试用例

javascript - react 状态更新不正确

c++ - pytorch/libtorch C++ 中的自定义子模块

C++:重载 = 运算符以创建 uint8_t 兼容数据类型

c++ - 编译器在不应该尝试从 int 初始化枚举类

python-3.x - python - 如何允许在没有类名的情况下从外部访问类属性?