Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Ответ в <type_traits>

Для определения подписи типа используйте std::is_signed и std::is_unsigned.

Для добавления/удаления подписи есть std::make_signed и std::make_unsigned.

Ответ 2

Если вы не можете или не хотите зависеть от функций TR1/С++ 0x, Boost.TypeTraits также предлагает вам make_unsigned<> и др.