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