문제

이진 "플래그"를 사용하여 상태 나 옵션 또는 유사한 것을 나타내고 싶다면 전달하여와 같은 물체에 저장할 수 있습니다. 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 스타일의 비트 플래그 대신 사용해야한다고 설교 할 것입니다. 그러나 두 솔루션 모두 괜찮습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top