Я хочу определить класс шаблона, параметр шаблона которого всегда будет целым. Класс будет содержать два члена, один из типов T
, а другой как неподписанный вариант типа T
- то есть if 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 для каждого типа? Или это единственный способ сделать это?