2010-05-13 2 views
17

템플릿 매개 변수가 항상 정수 유형 인 템플릿 클래스를 정의하려고합니다. 클래스에는 T 유형의 두 멤버와 T 유형의 서명되지 않은 변형이 포함됩니다. 즉 T == int 인 경우 T_Unsigned == unsigned int 인 경우입니다. 내 첫 번째 본능은 이렇게했다 :명시 적 특성없이 정수 템플릿 매개 변수의 부호있는/서명되지 않은 변형 가져 오기

template <typename T> class Range { 
    typedef unsigned T T_Unsigned; // does not compile 
public: 
    Range(T min, T_Unsigned range); 
private: 
    T m_min; 
    T_Unsigned m_range; 
}; 

하지만 작동하지 않습니다. 나는 다음과 같이, 부분 템플릿 특수화를 사용하는 방법에 대한 생각이 작동

template <typename T> struct UnsignedType {}; // deliberately empty 
template <> struct UnsignedType<int> { 
    typedef unsigned int Type; 
}; 

template <typename T> class Range { 
    typedef UnsignedType<T>::Type T_Unsigned; 
    /* ... */ 
}; 

, 그래서 당신이 부분적으로 모든 정수 유형 UnsignedType을 전문으로. 약간의 추가 복사 - 붙여 넣기 작업 (매크로를 현명하게 사용하는 것)이지만 유용합니다.

그러나 이제는 Traits 클래스 유형을 수동으로 정의 할 필요없이 정수 유형의 서명 된 값을 결정하고 유형의 부호없는 변형을 사용하는 다른 방법이 있습니까? 아니면 이것을 할 수있는 유일한 방법입니까?

답변

20

대답이 (가) 형의 사용 표준의 로그인 다움 :: is_signed 및 표준 : : 추가하려면

을 is_unsigned를 결정하는 <type_traits>

에/로그인 다움을 제거, 표준 : make_signed있다 및 표준 :: make_unsigned

+0

+1 "왜 그런 생각을하지 않았습니까?"대답. :) –

3

TR1/C++ 0x 기능에 의존하고 싶지 않거나 의존하고 싶지 않다면 Boost.TypeTraitsmake_unsigned<> 등을 제공합니다.

+0

+1 - ''을 지원하지 않는 Visual Studio 2005를 사용하고 있습니다. 따라서 대안이 있으면 편리합니다. 나는 여전히 표준 라이브러리의 일부로 대답으로 ''을 대답했습니다. –

+0

@Blair : 조심스럽게, 실제로는 * "아직 빠져 나가지 않은 다음 표준의 일부"*가 될 것입니다. –

관련 문제