이진 플래그를 사용하여 상태, 옵션 등을 나타냅니다.
문제
이진 "플래그"를 사용하여 상태 나 옵션 또는 유사한 것을 나타내고 싶다면 전달하여와 같은 물체에 저장할 수 있습니다. OPTION1 | OPTION2
어디 OPTION1
0001입니다 OPTION2
0010이므로 통과되는 것은 0011이므로 옵션의 혼합을 나타냅니다.
C ++에서 어떻게해야합니까? 나는 같은 생각을하고 있었다
enum Option {
Option_1 = 0x01,
Option_2 = 0x02,
Option_3 = 0x04,
//...
}
void doSomething(Option options) {
//...
}
int main() {
doSomething(Option_1|Option_2);
}
그러나 이상적으로는 doSomething
주어진 옵션을 해석하는 방법을 알고 있습니다.
내가 올바른 길을 가고 있습니까? 더 좋은 방법이 있습니까?
업데이트
그리고 나는 정의 할 필요가 없을 것입니다 Option
가능한 모든 조합에 대해서도?
해결책
이것은 이러한 일들이 수행되는 일반적인 방법입니다. doSomething
비트를 사용할 수 있습니다 and
옵션이 선택되었는지 확인하려면 연산자 :
if (options & Option_1){
// option 1 is selected
}
또는 사용을 고려할 수 있습니다 비트 필드:
struct Options {
unsigned char Option_1 : 1;
unsigned char Option_2 : 1;
};
Options o;
o.Option_1 = 1;
o.Option_2 = 0;
다른 팁
그게 내가 할 수있는 방식 일 것입니다. 그러나 열거를 좀 더 읽기에 쉽게 만들기 위해 사용할 수있는 많은 트릭이 있습니다.
enum Option {
Option1 = 1 /*<< 0*/,
Option2 = 1 << 1,
Option3 = 1 << 2,
// etc.
};
또한 열거를 위해 Bitwise 연산자를 지정해야합니다. 같은 것을 고려하십시오 ASL enum_ops
이것을 돕는 유틸리티.
사람들이 일반적으로 그러한 깃발을 사용하는 방식은 다음과 같이 함수를 정의하는 것입니다.
void doSomething( unsigned int options )
{
//...
}
다른 모든 것은 당신이 원하는대로 정확하게 작동합니다 :)
다른 방법은 자신만의 "플래그"클래스를 만드는 것입니다. 그런 다음 수업에서 다음과 같이 몇 가지 기능이 있습니다.
bool GetOption( Option option )
{
return (m_Option & option) > 0;
}
void SetOption( Option option )
{
m_Option |= option;
}
void ClearOption( Option option )
{
m_Option &= ~option;
}
또는 작업자에게 원하는대로 정확하게 수행하도록 작업자에게 과부하를 걸었습니다.
Flags( unsigned int options ) :
m_Option( options )
{
}
Flags operator|( const Flags& flags )
{
return Flags( m_Option | flags.m_Option );
}
등등.
당신은 그것을 확인하고 싶을 수도 있습니다 STL 비트 세트. 어떤 사람들은 항상 C 스타일의 비트 플래그 대신 사용해야한다고 설교 할 것입니다. 그러나 두 솔루션 모두 괜찮습니다.