в моих проектах, когда у меня в классе много логических выражений, я упаковываю их следующим образом.
class A {
//...
struct { //note: unnamed struct
bool bCondA : 1;
bool bCondB : 1;
bool bCondC : 1;
//... and so on...
};
//...
};
void funcA(){
A objA;
if(A.bCondB){
//...
}
else if (A.bCondC){
//...
}
}
вы можете использовать флаги-члены / логические значения, как обычно, как обычный член bool в любом коде,редактирование будет только для определения класса.
Если я хочу манипулировать несколькими из них в одной операции, я делаю это:
class A {
//...
union { //note: unnamed union
struct { //note: unnamed struct
bool m_bCondA : 1;
bool m_bCondB : 1;
bool m_bCondC : 1;
//... and so on...
};
int m_bAllFlags; //note: you can change int to int8_t or any type that will fit all the flags.
};
void methodX(); //method for testing.
void clearFlags(){ m_bAllFlags = 0; } //clear all flags in 1 swoop.
void clearGroup1Flags(){ m_bAllFlags & ~0b0110101101; }
//...
};
void A::methodX(){
A objA;
objA.m_bCondC = true;
if(objA.m_bCondA){
//...
}
else if (objA.m_bCondA){
//...
}
objA.clearFlags();
}
Я не знаю, каковыполный список достоинств и недостатков, но у меня это хорошо работает.