Как определить количество битов в шаблоне нетипичного интегрального постоянного параметра? - PullRequest
3 голосов
/ 13 октября 2010

Я бы предположил, что это описано в стандарте C ++, но я не смог его найти. Я пишу несколько шаблонов, которые собираются выполнять арифметику с их нетиповыми интегральными параметрами, и я нахожу, что мне нужен эквивалент MAX_INT для параметра 'x' в шаблоне, подобном template <int x> Foo.

В идеале кто-то может указать мне на абзац в стандарте (если таковой существует), который дает допустимые диапазоны для размеров интегральных параметров шаблона и любой способ определения фактического количества битов в конкретной реализации.

-
Чтобы уточнить: это шаблоны, которые будут выполнять математику в системе типов, как часть библиотеки метапрограммирования. 'Int' никогда не будет создан и никогда не займет хранилище во время выполнения. Во многих отношениях он аналогичен математике, выполняемой препроцессором, и в этом случае я знаю, что целочисленные типы не обязательно имеют тот же размер, что и int. То, что я ищу, является частью стандарта, которая говорит, являются ли типы одинаковыми или нет, и если нет, сколько битов используются интегральными параметрами шаблона во время компиляции.

Ответы [ 3 ]

4 голосов
/ 13 октября 2010

См. числовые ограничения .Документация для std::numeric_limits<>::digits гласит:

Для целочисленных типов: количество незнаковых битов (базовых цифр радиуса) в представлении .Для плавающих типов: количество цифр (в основании радиуса) в мантиссе (эквивалент FLT_MANT_DIG, DBL_MANT_DIG или LDBL_MANT_DIG).

Редактировать :

* 1015другие методы, такие как min(), max() и тому подобное.
3 голосов
/ 13 октября 2010

Вам нужен класс numeric_limit http://www.cplusplus.com/reference/std/limits/numeric_limits/

В частности,

numeric_limits<T>::max()

даст вам CHAR_MAX, SCHAR_MAX, UCHAR_MAX, SHRT_MAX, USHRT_MAX, INT_MAX, UINT_MAX, LONG_MAX, LONG_MX, ULL_GX, UL, DBL_MAX или LDBL_MAX, в зависимости от T.

2 голосов
/ 13 октября 2010

См. Здесь: http://www.boost.org/doc/libs/1_41_0/libs/integer/integer_traits.html

Редактировать: На самом деле он не дает никакой информации о стандарте, однако вы можете получить минимальное и максимальное значения во время компиляции для определенных типов.

Edit2: Согласно вашему обновлению я могу предложить вам использовать boost.mpl , boost.type_traits и ранее упомянутую библиотеку boost.integer_traits .

Boost также предоставляет заголовок cstdint.hpp (часть библиотеки boost.integer ), который определяет типы, такие как boost :: uint32_t или boost :: int32_t, которые гарантируют, что вы получите тип, который поддерживает 32 бита.,(Конечно, также для 8, 16 и 64 битов)

С boost.type_traits вы можете, например, сравнить два типа, если они равны.Для этого вы будете использовать boost :: is_same .

Boost MPL предлагает вам алгоритмы времени компиляции, условия и т. Д., А целочисленные черты предложат вам способ времени компиляции, чтобы получить ограничения.для типов.

HTH

...