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