2013-05-11 4 views
3

는 다음 테스트를 고려 근본적인 유형의 모든 CONST/휘발성/서명/서명되지 않은 버전에 대한 사실이다 :유형의 특성은 느릅 나무

std::is_same<T, bool>::value 
std::is_same<T, char>::value 
std::is_same<T, short int>::value 
std::is_same<T, int>::value 
std::is_same<T, long int>::value 
std::is_same<T, long long int>::value 
std::is_same<T, float>::value 
std::is_same<T, double>::value 
std::is_same<T, long double>::value 

문제는 T = const unsigned char 경우, 모든 테스트가 false가 될 것이며, 내가 좋아하는 것입니다 이건 std::is_same<T, char>::value이 참이어야합니다. 또는 T = volatile signed long long int 인 경우 std::is_same<T, long long int>::value을 true로 지정하십시오. type_traits으로 어떻게 할 수 있습니까? 존재하는 경우 constvolatile을 제거하는

답변

7

사용 std::remove_cv :

std::is_same<std::remove_cv<T>::type, long long int>::value; 
4

당신은 const를 휘발성 지정자 돌봐 std::remove_cv를 사용할 수 있습니다.

그리고 std::make_signed을 사용하여 서명/서명되지 않은 문제를 처리 할 수 ​​있습니다. 그러나, 나는 그 아이디어를 특히 좋아하지 않는다 (unsigned char은 실제로 char과 같은가?).

std::is_same< std::make_signed< std::remove_cv<T> >, char >::value; 

이들의 char, unsigned char, const char, const unsigned char, 휘발성 버전의 마찬가지 일 것이다.

+0

이기종 시스템에서 생성 된 파일의 데이터 모델을 탐지하는 클래스를 설계하고 유형의 부호가있는/부호없는 버전은 동일한 양의 바이트로 인코딩됩니다. – Vincent

+0

'unsigned char','signed char'과'char'는 세 개의 다른 타입입니다 (§3.9.1.1 참조). 그러므로이 예제는'signed char'을 생성하고 그것을'char'와 비교하기 때문에 사실이 아닙니다. 언제든지 테스트 해보십시오. https://ideone.com/T8QdYw –

관련 문제