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,
나는 오류를 얻었다.
* "하지만 나는 그의 힌트를 따르지 못했습니다"* 시도해주십시오. – dyp