C++ 避免多重布尔的优雅方式?
在我的小GUI库中,不同的东西会导致小部件不可见 窗户可能会倒塌。所有的孩子都必须递归地变得不可见。 用户可以手动隐藏小部件。 小部件可能会被排除。设想一个快门列表框:只有当按下列表框按钮时,快门及其内容才会显示。 这是我当前的解决方案:C++ 避免多重布尔的优雅方式?,c++,user-interface,C++,User Interface,在我的小GUI库中,不同的东西会导致小部件不可见 窗户可能会倒塌。所有的孩子都必须递归地变得不可见。 用户可以手动隐藏小部件。 小部件可能会被排除。设想一个快门列表框:只有当按下列表框按钮时,快门及其内容才会显示。 这是我当前的解决方案: class Widget { // ... bool collapsed; bool hidden; bool excluded; public: bool isVisible() { return
class Widget {
// ...
bool collapsed;
bool hidden;
bool excluded;
public:
bool isVisible() { return !collapsed && !hidden && !excluded; }
void hide() { hidden = true; }
void show() { hidden = false; }
// ...
};
我不喜欢用三个布尔值来表示同一件事
我考虑过使用int:
但用户可能会意外调用hide两次
有没有一种优雅的方法来避免重复基本上做相同事情的变量?我不在乎小部件是否折叠、隐藏或排除,我只想知道它是否可见,并还原折叠、隐藏或排除小部件的效果。使用枚举表示窗口的状态:
enum window_state
{
OPENED,
CLOSED,
COLAPSED,
MINIMIZED,
...
};
请注意,这正是您使用int解决方案所做的,这正是枚举被设计的目的
因此,您的实现可以是这样的:
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...
};
使用枚举表示窗口的状态:
enum window_state
{
OPENED,
CLOSED,
COLAPSED,
MINIMIZED,
...
};
请注意,这正是您使用int解决方案所做的,这正是枚举被设计的目的
因此,您的实现可以是这样的:
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...
};
我不喜欢用三个布尔值来表示同一件事
就像你自己说的,这不是一回事。这三个条件都是独立的
在我看来,你采取了正确的方法,而且看起来应该是可见的
我不喜欢用三个布尔值来表示同一件事
就像你自己说的,这不是一回事。这三个条件都是独立的
在我看来,你采取了正确的方法,而且看起来应该是可见的。不要浪费这些东西!你只需要三个,所以让我们去掉24个,可能整数是32。现在,在C++14中,它非常简单,非常简单:
char hiddenLevelStoredAsACharacter;
hiddenLevelStoredAsACharacter |= 0b00000001;
或者对于排除在外的情况,如何:
hiddenLevelStoredAsACharacter |= 0b00000010;
如果这不起作用,可能有一种方法可以使用模板来实现。不要浪费这些信息!你只需要三个,所以让我们去掉24个,可能整数是32。现在,在C++14中,它非常简单,非常简单:
char hiddenLevelStoredAsACharacter;
hiddenLevelStoredAsACharacter |= 0b00000001;
或者对于排除在外的情况,如何:
hiddenLevelStoredAsACharacter |= 0b00000010;
如果这不起作用,可能有一种使用模板的方法。
它们之间有什么区别?你可以考虑检查直接父函数。看起来它可以被建模为状态机。EnUM +位掩码检查怎么样?它们之间的区别是什么?您可以考虑检查直接父类。这看起来像是一个状态机。EnUM +位掩码检查怎么样?请大家注意,如今智能编译器和高度复杂的体系结构比特集的速度并不比布尔运算快。仅将位集用于压缩数据的目的—简化系统、驱动程序等。否则,这些技巧毫无意义。请大家注意,如今智能编译器和高度复杂的体系结构—位集的速度并不比布尔运算快。仅将位集用于压缩数据目的—对系统、驱动程序等进行加密。否则,这些技巧将毫无意义。