c++ templates unsigned traits partial-specialization

c++ - Obtenga la variante firmada/sin firmar de un parámetro de plantilla de entero sin rasgos explícitos



templates unsigned (2)

Estoy buscando definir una clase de plantilla cuyo parámetro de plantilla siempre será un tipo entero. La clase contendrá dos miembros, uno de tipo T , y el otro como la variante no firmada de tipo T , es decir, si T == int , entonces T_Unsigned == unsigned int . Mi primer instinto fue hacer esto:

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; };

Pero no funciona. Entonces pensé en usar la especialización de plantillas parciales, así:

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; /* ... */ };

Esto funciona, siempre y cuando se especialice parcialmente en UnsignedType para cada tipo de entero. Es un poco de trabajo adicional de copiar y pegar (reducir el uso juicioso de macros), pero útil.

Sin embargo, ahora tengo curiosidad: ¿existe otra forma de determinar el carácter con signo de un tipo entero y / o usar la variante sin signo de un tipo, sin tener que definir manualmente una clase de Rasgos por tipo? ¿O es esta la única manera de hacerlo?


La respuesta está en <type_traits>

Para determinar la firma de un tipo use std :: is_signed y std :: is_unsigned

Para agregar / eliminar ness firmado, hay std :: make_signed y std :: make_unsigned


Si no puede o no quiere depender de las características de TR1 / C ++ 0x, Boost.TypeTraits también le ofrece make_unsigned<> et al.