템플릿 매개 변수가 항상 정수 유형 인 템플릿 클래스를 정의하려고합니다. 클래스에는 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 클래스 유형을 수동으로 정의 할 필요없이 정수 유형의 서명 된 값을 결정하고 유형의 부호없는 변형을 사용하는 다른 방법이 있습니까? 아니면 이것을 할 수있는 유일한 방법입니까?
+1 "왜 그런 생각을하지 않았습니까?"대답. :) –