2017-02-27 8 views
0

C++ 11 enum class을 비트 필드로 사용하고 멋진 접근 방법을 찾으십시오. here.bitmask_operators.hpp를 네임 스페이스 및 클래스와 함께 사용하는 방법

하지만 내 열거 형 클래스 선언이 전역 네임 스페이스가 아니라 사용자 지정 네임 스페이스 또는 클래스 내부에있는 경우에 막혔습니다. 예컨대 :

#define ENABLE_BIT_OPERATORS(E) template<> struct enable_bitmask_operators<E> { static constexpr bool enable=true; }; 

// anonymous namespace 
namespace { 
enum class Ean { 
    None = 0x00, 
    Bit0 = 0x01, 
    Bit1 = 0x02, 
    Bit2 = 0x04, 
    Bit3 = 0x08, 
}; 
ENABLE_BIT_OPERATORS(Ean) 
} // anonymous namespace 

// custom namespace 
namespace Custom { 
enum class Ecn { 
    None = 0x00, 
    Bit0 = 0x01, 
    Bit1 = 0x02, 
    Bit2 = 0x04, 
    Bit3 = 0x08, 
}; 
ENABLE_BIT_OPERATORS(Ecn) 
} // custom namespace 

// inside class in global namespace 
class MyclassGN { 
public: 
    enum class Ecgn { 
     None = 0x00, 
     Bit0 = 0x01, 
     Bit1 = 0x02, 
     Bit2 = 0x04, 
     Bit3 = 0x08, 
    }; 
    ENABLE_BIT_OPERATORS(Ecgn) 
}; 

// inside class in anonymous namespace 
namespace { 
class MyclassAN { 
public: 
    enum class Ecan { 
     None = 0x00, 
     Bit0 = 0x01, 
     Bit1 = 0x02, 
     Bit2 = 0x04, 
     Bit3 = 0x08, 
    }; 
    ENABLE_BIT_OPERATORS(Ecan) 
}; 
} // anonymous namespace 

// inside class in custom namespace 
namespace Custom { 
class MyclassGN { 
public: 
    enum class Ecgn { 
     None = 0x00, 
     Bit0 = 0x01, 
     Bit1 = 0x02, 
     Bit2 = 0x04, 
     Bit3 = 0x08, 
    }; 
    ENABLE_BIT_OPERATORS(Ecgn) 
}; 
} // custom namespace 

이 항상 나에게주는 오류 :

error: specialization of 'template<class E> struct enable_bitmask_operators' in different namespace 

내가 (이 경우 글로벌 네임 스페이스)을 bitmask_operators.hpp에서 enable_bitmask_operators가있는 템플릿과 같은 네임 스페이스 내 템플릿 특수화를 배치 할 때까지

.

하지만 전문 분야를 enum 클래스 선언에 가깝게하고 싶습니다.

위에서 언급 한 article에서이 문제는 Jay Miller가 주석을 달았으며 해결책을 제시 한 것으로 보입니다. 그러나 나는 bitmask_operators.hpp에서 이것을 해결하기위한 그의 힌트를 따르지 않았다.

예제 코드 here.

편집/부분적으로 해결 : 나는 그 동안 작업을했습니다 (덤프 사본 & 붙여 넣기 문제 및 암호 오류 메시지 ;-). 나는 제이 밀러 constexpr 함수 솔루션을 적용하여 제 example code을 업데이트했습니다.

하지만 클래스 내부에서 enum 클래스를 선언 할 때 여전히 문제가 있습니다.

class MyclassGN { 
public: 
    enum class Ecgn { 
     None = 0x00, 
     Bit0 = 0x01, 
     Bit1 = 0x02, 
     Bit2 = 0x04, 
     Bit3 = 0x08, 
    }; 
    static ENABLE_BIT_OPERATORS(Ecgn) 
    explicit MyclassGN(Ecgn e_) {} 
}; 
:

enclosing class of constexpr non-static member function 'bool MyclassGN::enable_bitmask_operators(MyclassGN::Ecgn)' is not a literal type 

글쎄, 나는 static 키워드를 추가하여이 고정 :

class MyclassGN { 
public: 
    enum class Ecgn { 
     None = 0x00, 
     Bit0 = 0x01, 
     Bit1 = 0x02, 
     Bit2 = 0x04, 
     Bit3 = 0x08, 
    }; 
    ENABLE_BIT_OPERATORS(Ecgn) 
    explicit MyclassGN(Ecgn e_) {} 
}; 

그럼 내가 오류가 발생했습니다 : 내가 좋아하는, 내 수업에의 ctor를 추가 할 때 문제는 제기

그러나 비트 마스크 연산자를 사용하려고하면 다음 문제가 발생합니다. 예 :

class MyclassGN { 
public: 
    enum class Ecgn { 
     None = 0x00, 
     Bit0 = 0x01, 
     Bit1 = 0x02, 
     Bit2 = 0x04, 
     Bit3 = 0x08, 
    }; 
    static ENABLE_BIT_OPERATORS(Ecgn) 
    explicit MyclassGN(Ecgn e_): e(e_) { 
     e |= Ecgn::Bit3; 
    } 
private: 
    Ecgn e; 
}; 
을있는 오류를 보여줍니다

no match for 'operator|=' (operand types are 'MyclassGN::Ecgn' and 'MyclassGN::Ecgn') 

업데이트 예 : 17,451,515,

나는 오류를 얻었다.

+0

* "하지만 나는 그의 힌트를 따르지 못했습니다"* 시도해주십시오. – dyp

답변

1

Anthony Williams의 bitmask_operators.hpp을 기반으로하는 예제 코드와 템플릿 (<> struct 대신 constexpr 함수)을 적용하여 네임 스페이스 문제를 해결하는 방법은 here입니다.

클래스 내부에서 enum 클래스를 선언 할 때 constexpr 함수 앞에 friend 키워드가 있어야합니다 (아래 주석에 제안 된 dyp). 예 :

class Myclass { 
public: 
    enum class E { 
     None = 0x00, 
     Bit0 = 0x01, 
     Bit1 = 0x02, 
     Bit2 = 0x04, 
     Bit3 = 0x08, 
    }; 
    friend ENABLE_BIT_OPERATORS(E) 
}; 
+1

클래스 내부에서 friend 함수를 사용할 수 있습니다 (예 : http : //coliru.stacked-crooked).com/a/eecfd85c6e1089e0), namespace-scope에서 해당 함수를 선언하고 한정 ID를 사용하여 열거 형을 참조하는 경우를 제외하고는 하나의 단일 매크로로 수행하는 방법을 알지 못합니다. 하지만 어쨌든 매크로를 싫어하므로'constexpr bool enable_bitmask_operators'와'friend constexpr enable_bitmask_operators' 둘 다 괜찮을 것입니다. – dyp

+0

네,'friend' 키워드를 사용하여 작업하십시오. – Joe