2010-03-16 13 views
7

¿Hay alguna manera de obtener un equivalente sin signo (del mismo tamaño) de un tipo integral firmado en C++? Estoy pensando en la línea de:¿Cómo obtener el equivalente sin signo de un tipo integral en C++?

template<typename T> 
struct get_unsigned { }; 

template<> 
struct get_unsigned<int> { 
    typedef unsigned int type; 
}; 

... 

template<typename T> 
void myfunc(T val) { 
    get_unsigned<T>::type u = std::abs(val); 
    ... 
} 

Busco una solución existente en la biblioteca o refuerzo estándar y prefieren no poner mi propia a menos que sea un puñado de líneas.

Respuesta

8

Boost.TypeTraits tiene make_unsigned:

tipo: Si T es un tipo entero sin signo entonces el mismo tipo que T, si T es un tipo entero firmado, entonces el tipo sin signo correspondiente. De lo contrario, si T es un tipo enumerado o de caracteres (char o wchar_t), entonces un tipo entero sin signo con el mismo ancho que T.

Si T tiene cv-qualifiers, estos también están presentes en el tipo de resultado.

The source es mucho más que un puñado de líneas.

+0

Esto se agregó al stdlib en C++ 11 como, predeciblemente, 'std :: make_unsigned': http://www.cplusplus.com/reference/type_traits/make_unsigned/ –

Cuestiones relacionadas