std::is_scalar
Определён в заголовочном файле <type_traits> | ||
|---|---|---|
template< class T > struct is_scalar; | (начиная с C++11) |
std::is_scalar — это унарный типовой признак.
Если T является скалярным типом, предоставляет константу-член value, равную true. Для любого другого типа value равно false.
Если программа добавляет специализации для std::is_scalar или std::is_scalar_v, поведение не определено.
Параметры шаблона
| T | - | тип для проверки |
Вспомогательный шаблон переменной
template< class T > constexpr bool is_scalar_v = is_scalar<T>::value; | (начиная с C++17) |
Унаследовано от std::integral_constant
Константы-члены
|
value
[статическая] |
true, если T является скалярным типом, в противном случае false (общедоступная статическая константа-член) |
Функции-члены
|
operator bool | преобразует объект в bool, возвращает value (общедоступная функция-член) |
|
operator()
(C++14) | возвращает value (общедоступная функция-член) |
Типы-члены
| Тип | Определение |
|---|---|
value_type | bool |
type | std::integral_constant<bool,value> |
Примечания
Каждая отдельная ячейка памяти в модели памяти C++, включая скрытые ячейки памяти, используемые языковыми средствами (например, указатель на таблицу виртуальных функций), имеет скалярный тип (или представляет собой последовательность смежных битовых полей ненулевой длины). Порядок выполнения побочных эффектов при вычислении выражений, синхронизация между потоками и упорядочивание зависимостей определяются в терминах отдельных скалярных объектов.
Возможная реализация
template<class T>
struct is_scalar : std::integral_constant<bool, std::is_arithmetic<T>::value
|| std::is_enum<T>::value
|| std::is_pointer<T>::value
|| std::is_member_pointer<T>::value
|| std::is_null_pointer<T>::value
#if __cpp_impl_reflection > 0
|| std::is_reflection_v<T>
#endif
>
{};
|
Пример
#include <iostream>
#include <type_traits>
#include <typeinfo>
#include <utility>
template<typename Head, typename... Tail>
void are_scalars(Head&& head, Tail&&... tail)
{
using T = std::decay_t<decltype(head)>;
std::cout << typeid(T).name() << " is "
<< (std::is_scalar_v<T> ? "" : "not ")
<< "a scalar\n";
if constexpr (sizeof... (Tail))
{
are_scalars(std::forward<decltype(tail)>(tail)...);
}
}
int main()
{
struct S { int m; } s;
int S::* mp = &S::m;
enum class E { e };
are_scalars(42, 3.14, E::e, "str", mp, nullptr, s);
}
Возможный вывод:
int is a scalar double is a scalar main::E is a scalar char const* is a scalar int main::S::* is a scalar nullptr is a scalar main::S is not a scalar
См. также
|
(C++11) | проверяет, является ли тип арифметическим (шаблон класса) |
|
(C++11) | проверяет, является ли тип перечислением (шаблон класса) |
|
(C++11) | проверяет, является ли тип типом указателя (шаблон класса) |
|
(C++11) | проверяет, является ли тип указателем на нестатическую функцию-член или объект (шаблон класса) |
|
(C++26) | проверяет, является ли отражённый тип скалярным (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_scalar