Necesito averiguar el tipo integral sin signo más pequeño que puede representar un número particular, en tiempo de compilación. Algo como esto ...Cómo averiguar el tipo integral más pequeño que puede representar un número, en tiempo de compilación
//////////////////////////////////////////////////////////////////////////
template<size_t Bits>
struct uint_least{};
template<>
struct uint_least<8>{ typedef std::uint8_t type; };
template<>
struct uint_least<16>{ typedef std::uint16_t type; };
//////////////////////////////////////////////////////////////////////////
template<size_t max>
struct uint_least_bits
{
static const size_t value = 14; // just a placeholder
};
//////////////////////////////////////////////////////////////////////////
template<size_t max>
class A
{
typedef typename uint_least<uint_least_bits<max>::value>::type underlying_type;
underlying_type m_X;
};
uint_least
tiene la intención de dar al tipo entero sin signo más pequeño que es, al menos, Bits
grande y que debería funcionar para cualquier valor hasta 64 (no sólo de 8, 16, 32, 64 pero también 1, 4, 13, etc.).
uint_least_bits
está destinado a darle el número mínimo de bits necesarios para representar max
.
- ¿Cómo puedo implementar
uint_least
? - ¿Cómo puedo implementar
uint_least_bits
? - ¿Qué tipos deberían ser
bits
,min
ymax
? Si la respuesta es un tipo de plantilla, ¿cómo puedo protegerme contra las entradas no válidas?
La estructuración exacta de los rasgos no es importante. Siéntase libre de desechar lo que proporcioné. Solo necesito proporcionar un número y recuperar el tipo integral sin signo más pequeño que pueda contenerlo.
Puedes simplemente usar 'decltype' en tu constante integral. –
¿Debería 'int_least_bits <255, 256> :: value' ser 1 o 9? – GManNickG
@GManNickG Buena pregunta. Yo diría que 9, sin embargo, no dude en estar en desacuerdo y dígame por qué – David