Spec-Zone.ru › C++

std::is_integral

Определено в заголовке <type_traits>
template< class T >
struct is_integral;
(с C++11)

std::is_integral является UnaryTypeTrait.

Проверяет, является ли T целочисленным типом. Предоставляет статическую константу value, которая равна true, если T — это тип bool, char, char8_t(с C++20), char16_t, char32_t, wchar_t, short, int, long, long long, или любой определённый реализацией расширенный целочисленный тип, включая любые знаковые, беззнаковые и cv-квалифицированные варианты. В противном случае, value равно false.

Поведение программы, добавляющей специализации для std::is_integral или std::is_integral_v, не определено.

Параметры шаблона

T - тип для проверки

Вспомогательный шаблон переменной

template< class T >
inline constexpr bool is_integral_v = is_integral<T>::value;
(с C++17)

Унаследовано от std::integral_constant

Статические члены

value
[static]
true если T — это целочисленный тип, false в противном случае
(публичная статическая константа)

Члены-функции

operator bool
преобразует объект в bool, возвращает value
(публичная функция-член)
operator()
(C++14)
возвращает value
(публичная функция-член)

Типы-члены

Тип Определение
value_type bool
type std::integral_constant<bool, value>

Возможная реализация

// Note: this implementation uses C++20 facilities
template<class T>
struct is_integral : std::bool_constant<
    requires (T t, T* p, void (*f)(T)) // T* parameter excludes reference types
    {
        reinterpret_cast<T>(t); // Exclude class types
        f(0); // Exclude enumeration types
        p + t; // Exclude everything not yet excluded but integral types
    }> {};

Пример

#include <iomanip>
#include <iostream>
#include <type_traits>
 
class A {};
 
struct B { int x:4; };
using BF = decltype(B::x); // bit-field's type
 
enum E : int {};
 
template <class T>
T f(T i)
{
    static_assert(std::is_integral<T>::value, "Integral required.");
    return i;
}
 
#define SHOW(...) \
    std::cout << std::setw(29) << #__VA_ARGS__ << " == " << __VA_ARGS__ << '\n'
 
int main()
{
    std::cout << std::boolalpha;
 
    SHOW(std::is_integral<A>::value);
    SHOW(std::is_integral_v<E>);
    SHOW(std::is_integral_v<float>);
    SHOW(std::is_integral_v<int*>);
    SHOW(std::is_integral_v<int>);
    SHOW(std::is_integral_v<const int>);
    SHOW(std::is_integral_v<bool>);
    SHOW(std::is_integral_v<char>);
    SHOW(std::is_integral_v<BF>);
    SHOW(f(123));
}

Вывод:

   std::is_integral<A>::value == false
        std::is_integral_v<E> == false
    std::is_integral_v<float> == false
     std::is_integral_v<int*> == false
      std::is_integral_v<int> == true
std::is_integral_v<const int> == true
     std::is_integral_v<bool> == true
     std::is_integral_v<char> == true
       std::is_integral_v<BF> == true
                       f(123) == 123

См. также

integral
(C++20)
определяет, что тип является целочисленным типом
(концепт)
is_integer
[static]
определяет целочисленные типы
(публичная статическая константа std::numeric_limits<T> )
is_floating_point
(C++11)
проверяет, является ли тип типом с плавающей точкой
(шаблон класса)
is_arithmetic
(C++11)
проверяет, является ли тип арифметическим типом
(шаблон класса)
is_enum
(C++11)
проверяет, является ли тип типом перечисления
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/is_integral

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API