Целые числа: получить самый большой кроссплатформенный тип, лежащий в основеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Целые числа: получить самый большой кроссплатформенный тип, лежащий в основе

Сообщение Anonymous »

Чтобы поддерживать кроссплатформенные границы на целочисленных значениях, я создал следующую черту: < /p>

Код: Выделить всё

template  struct min_underlying { using type = T; };
template  struct min_underlying { using type = int16_t; };
template  struct min_underlying { using type = uint16_t; };
template  struct min_underlying { using type = int32_t; };
template  struct min_underlying { using type = uint32_t; };
template  struct min_underlying { using type = int32_t; };
template  struct min_underlying { using type = uint32_t; };
template  struct min_underlying { using type = int64_t; };
template  struct min_underlying { using type = uint64_t; };
template  using min_underlying_t = typename min_underlying::type;
Таким образом, я могу проверить границы с помощью std :: numeric_limits :

Код: Выделить всё

template 
void check(T n)
{
if(n > (T)std::numeric_limits::max())
error_message("...");
}
Но у меня есть проблема: под Unix 64bits, min_underlying_t insigned int . Это связано с тем, что std :: size_t определяется как Unsigned Long int под Unix, и этот тип может храниться в 32BIT на некоторых платформах. Это проблема, потому что на самом деле std :: size_t всегда 64Bits в исполняемом файле 64BITS. Но это не тот случай (потому что uint64_t без знака Long int под Unix). Итак, у меня есть проблема дизайна.
есть ли другой способ получить такую ​​функцию?

Подробнее здесь: https://stackoverflow.com/questions/796 ... lying-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»