2013-10-30 3 views
1

열거 형을 노출하는 클래스가 있습니다. 그래서처럼 setter 함수의 값의 유효성을 확인하려고 :열거 형 유효성 검사

enum abc 
{ 
    X, 
    Y 
}; 

int my_class::set_abc(abc value) 
{ 
    if(static_cast<int>(value) > static_cast<int>(Y)) 
     return -1; 
... 
} 

이되는 가치에 대해 유사한 검사가

내가 컴파일러가 완전히 수표를 제거하는 것을 볼 X. 이하 . 나는 그 이유를 봤 거든 C++에서 정수 변환에 대한 규칙을 설명하는 많은 페이지를 보았지만 enum을 int로 변환하거나 유효성을 검사하는 것에 대한 명확한 설명을 찾지 못했습니다.

이 작업을 수행하는 올바른 방법은 무엇입니까?

답변

1

이미가 그것을 생성하기 위해 정의되지 않은 동작을 호출 한 값보다 더 크거나 작은에 전달자는 유형 abc의 유효한 값이다.

이전에 UB를 일으킨 조건을 감지하기 위해 C++에서 코드를 쉽게 작성할 수 없습니다. 관찰 한 바와 같이 컴파일러는 언어에서 허용하거나 금지하는 것을 기반으로 최적화하는 경향이 있습니다.

값을 확인한 다음 열거 형으로 변환하는 오버로드를 작성하고 abc 과부하를 확인하는 것은 UB 호출을 피하기 위해 다른 사람의 문제이기 때문에 가능합니다.

또는 열거 형에 임의의 추가 값을 넣어 테스트가 중복되는 것을 방지 할 수 있습니다. 그렇다면 컴파일러는이를 제거 할 수 없습니다.

2

Y에 대한 테스트는 임의적 인 것으로 보이므로 일부 제한이 추가됩니다. 이것은 또한 min과 max 사이에 더 많은 요소를 추가 할 수있게하며, 순서와 관련이 없습니다. 01 이후

enum abc 
{ 
    ABC_MIN = 0, 
    X, 
    Y, 
    ABC_MAX 
}; 

int my_class::set_abc(abc value) 
{ 
    assert(value > ABC_MIN && value < ABC_MAX); 
{ 
0

C++에서는 명시 적 캐스팅없이 정수를 enum 개의 변수에 직접 할당 할 수 없습니다.

코드에 enum 유형 을 사용하는 경우이면 유효하지 않은 점은 없습니다. 처음부터 유효해야하며 유효해야합니다.

그러나 코드가 정수 값을 가져 와서 enum (또는 enum 값으로 산술 연산을 수행해야하는 경우)으로 변환해야하는 경우 해당 사이트의 값을 확인해야합니다.