2013-02-03 2 views
16

C++ 11 содержит классы шаблонов типов типов: std::is_integer и std::is_integral. Однако я не могу сказать о различиях между ними.Различия между std :: is_integer и std :: is_integral?

Какой тип, скажем T, может сделать std::is_integer<T>::value true и сделать std::is_integral<T>::value false?

ответ

18

std::is_integer<T> не существует.

Этот текст, std::numeric_limits<T>::is_integer есть.

Я не знаю каких-либо существенных различий между std::numeric_limits<T>::is_integer и std::is_integral<T>. Последний был разработан гораздо позже и стал стандартным в C++ 11, тогда как первый был введен в C++ 98.

+1

Я не вижу ответа на вопрос. – Raffi

9

Нет ни одного типа T, который имеет различные результаты для std::is_integral<T>::value и std::numeric_limits<T>::is_integer. Процитируем draft Standard:

3.9.1 Фундаментальные типы [basic.fundamental]

7 Типы BOOL, голец, char16_t, char32_t, wchar_t и подписанную и неподписанных целые типы собирательно называют интегральные типы. синоним интегрального типа целого типа. [...]

18.3.2.4 numeric_limits члены [numeric.limits.members]

static constexpr bool is_integer; 

17 Правда, если тип целое число.

20.9.4.1 категории основного вида [meta.unary.cat] (таблица 47)

template <class T> struct is_integral; 

Т является интегральный тип (3.9.1)

1

Разница заключается в том, что std::is_integral<T> распознает только десятичные целые числа, включая boolcharchar16_tchar32_twchar_tshortintlonglong long. В то время как std::numeric_limits<T>::is_integer будет распознавать все из них, а также floatdouble. Посмотрите на эти две страницы для получения дополнительной информации: is_integer, is_integral

0

std::is_integral_v<T> вернет true только для встроенных целых чисел.

Стандарт позволяет std::numeric_limits<T>::is_integer быть специализированным и возвращать true для пользовательских интегральных типов, таких как boost::multiprecion::cpp_int.