避免多个布尔值的优雅方式
Elegant way to avoid multiple booleans?
在我的小型GUI库中,不同的东西可能会导致Widget
变得不可见。
- 窗户可能会被折叠。所有子项都必须递归地变为不可见
- 用户可以手动隐藏小部件
- 小部件可能会被"排除在外"。想象一个"快门"列表框:只有按下列表框按钮时,快门及其内容才会显示
这是我目前的解决方案:
class Widget {
// ...
bool collapsed;
bool hidden;
bool excluded;
public:
bool isVisible() { return !collapsed && !hidden && !excluded; }
void hide() { hidden = true; }
void show() { hidden = false; }
// ...
};
我不喜欢用三个布尔值来表示相同的东西。
我考虑过使用int
:
class Widget {
int hiddenLevel{0};
bool isVisible() { return hiddenLevel == 0; }
void hide() { ++hiddenLevel; }
void show() { --hiddenLevel; }
};
但是用户可能会意外地调用hide()
两次。
有没有一种优雅的方法可以避免基本上做相同事情的变量重复?我不在乎小部件是collapsed
、hidden
还是excluded
,我只想知道它是否可见,并恢复折叠、隐藏或排除它的效果。
我不喜欢用三个布尔值来表示相同的东西。
正如你自己所说,这不是"一回事"。这三个条件都是独立的。
在我看来,你采取了正确的方法,isVisible()
看起来是应该的。
使用枚举来表示窗口的状态:
enum window_state
{
OPENED,
CLOSED,
COLAPSED,
MINIMIZED,
...
};
请注意,这正是您对"int solution"所做的,也是枚举的设计目的。
所以你的实现可能是这样的:
class Widget {
// ...
window_state current_state;
public:
bool isVisible() const
{
return current_state != window_state::CLOSED &&
current_state != window_state::MINIMIZED;
}
void hide() { current_state = window_state::CLOSED; }
void show() { current_state = window_state::OPPENED; }
// etc, etc...
};
不要浪费这些位!你只需要三个,所以让我们丢掉32分中的24分(可能)。现在,在C++14中,它就像一个tada一样简单,tada:
char hiddenLevelStoredAsACharacter;
hiddenLevelStoredAsACharacter |= 0b00000001;
或者对于排除,如何:
hiddenLevelStoredAsACharacter |= 0b00000010;
如果这不起作用,可能有一种方法可以使用模板来完成。
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将 10 个线程与原子布尔值同步
- 创建类似于布尔值的变量类型
- 布尔值向量的基于范围 for 循环
- 零点和布尔值之间的比较
- 简化对两个布尔值的 4 个 if/else 检查
- 无法创建带有布尔值和矢量的地图
- 对于完成布尔值设置为 true 后未停止的循环
- fstream / ifstream / ofstream 对象如何转换为布尔值
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 为什么布尔值不能比作最后一点?
- 如何使用返回布尔值的函数?
- 避免多个布尔值的优雅方式
- 将8个布尔值转换为一个字节的最佳方式