Не лучшее решение ... но просто для удовольствия ...
Я предлагаю черты типа (с помощником и с помощью выбора внутреннего типа), которые, учитывая число (количество байтов)и список типов выбирает первый тип списка с sizeof()
большим или равным (или ничем, если такого типа нет)
template <std::size_t, typename, typename = std::true_type>
struct sizeTypeH;
template <std::size_t Dim>
struct sizeTypeH<Dim, std::tuple<>, std::true_type>
{ }; // no type found
template <std::size_t Dim, typename T0, typename ... Ts>
struct sizeTypeH<Dim, std::tuple<T0, Ts...>,
std::integral_constant<bool, (sizeof(T0) >= Dim)>>
{ using type = T0; };
template <std::size_t Dim, typename T0, typename ... Ts>
struct sizeTypeH<Dim, std::tuple<T0, Ts...>,
std::integral_constant<bool, (sizeof(T0) < Dim)>>
: public sizeTypeH<Dim, std::tuple<Ts...>>
{ };
template <std::size_t Dim, typename ... Ts>
struct sizeType : public sizeTypeH<Dim, std::tuple<Ts...>>
{ };
template <std::size_t Dim, typename ... Ts>
using sizeType_t = typename sizeType<Dim, Ts...>::type;
Теперь еще один using
, который, получив целое число, вызываетчерты этого типа с упорядоченным списком intX_t
типов
template <std::size_t Dim>
using intType_t = sizeType_t<Dim, std::int8_t, std::int16_t, std::int32_t,
std::int64_t>;
В моей платформе у меня есть следующие проверенные static_assert()
.
using t8 = intType_t<1u>;
using t16 = intType_t<2u>;
using t32 = intType_t<4u>;
using t64 = intType_t<8u>;
static_assert( std::is_same<t8, std::int8_t>{}, "!" );
static_assert( std::is_same<t16, std::int16_t>{}, "!" );
static_assert( std::is_same<t32, std::int32_t>{}, "!" );
static_assert( std::is_same<t64, std::int64_t>{}, "!" );
Если завтра появитсяa int128_t
, вы можете просто добавить его в intType_t
using
определении.
Внимание, пожалуйста: нет никаких гарантий, что предыдущие static_assert()
будут выполнены.
First ofвсе потому, что стандарт гарантирует, что байт имеет длину не менее 8 бит;но может быть больше 8 бит.Если байт имеет 16 бит, то из
using t16 = intType_t<2u>;
вы получите тип 32 бит.
Второй, поскольку типы intX_t
являются дополнительными.