Класс is_integral
Класс is_integral из заголовочного файла type_traits
позволяет на этапе компиляции определить, является ли
переданный в качестве параметра тип целочисленным.
В первый параметр шаблона мы передаем проверяемый тип.
Класс содержит константное поле value, которое равно
true, если тип целочисленный, и false в противном случае.
К целочисленным типам относятся bool, char,
signed char, unsigned char, wchar_t,
char8_t, char16_t, char32_t,
short, int, long, long long
и их беззнаковые версии.
Синтаксис
std::is_integral<T>::value
std::is_integral_v<T>
Пример
Давайте проверим несколько типов на целочисленность:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
cout << boolalpha;
cout << is_integral<int>::value << endl;
cout << is_integral<double>::value << endl;
cout << is_integral<char>::value << endl;
cout << is_integral<bool>::value << endl;
return 0;
}
Результат выполнения кода:
true
false
true
true
Пример
Начиная с C++17 доступна краткая форма записи через
суффикс _v:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
cout << boolalpha;
cout << is_integral_v<long> << endl;
cout << is_integral_v<float> << endl;
cout << is_integral_v<unsigned int> << endl;
return 0;
}
Результат выполнения кода:
true
false
true
Пример
Давайте применим is_integral_v внутри if constexpr
для выбора поведения в зависимости от типа:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
void check(T value)
{
if constexpr (is_integral_v<T>)
{
cout << "integral: " << value << endl;
}
else
{
cout << "not integral" << endl;
}
}
int main()
{
check(42);
check(3.14);
return 0;
}
Результат выполнения кода:
"integral: 42"
"not integral"
Смотрите также
-
класс
is_integral_v,
который является краткой формой записи is_integral -
класс
is_same,
который проверяет совпадение двух типов -
класс
enable_if,
который включает шаблон при выполнении условия -
класс
if constexpr,
который выбирает ветку кода на этапе компиляции