Получить вариант со знаком / без знака целочисленного параметра шаблона без явных черт

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

Ваш ответ на вопрос