std::is_scalar
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <type_traits>
|
||
template< class T > struct is_scalar; |
(начиная с C++11) | |
std::is_scalar является UnaryTypeTrait.
Если T является скалярным типом, предоставляет константу-элемент value, равную true. Для любого другого типа value равна false.
Поведение программы, добавляющей специализации для std::is_scalar или std::is_scalar_v (начиная с C++17) не определено.
Параметры шаблона
| T | — | тип для проверки |
Шаблон вспомогательной переменной
<tbody> </tbody> template< class T > inline constexpr bool is_scalar_v = is_scalar<T>::value; |
(начиная с C++17) | |
Унаследован от std::integral_constant
Константы элементы
value [static] |
true, если T является скалярным типом, false иначе (public static константа-элемент) |
Функции-элементы
operator bool |
преобразует объект в bool, возвращает value (public функция-элемент) |
operator() (C++14) |
возвращает value (public функция-элемент) |
Типы элементы
| Тип | Определение |
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>
{};
|
Пример
Запустить этот код
#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()
<< (std::is_scalar_v<T> ? "" : " не ")
<< " является скаляром\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 является скаляром
double является скаляром
main::E является скаляром
char const* является скаляром
int main::S::* является скаляром
nullptr является скаляром
main::S не является скаляром
Смотрите также
(C++11) |
проверяет, является ли тип арифметическим типом (шаблон класса) |
(C++11) |
проверяет, является ли тип типом перечисления (шаблон класса) |
(C++11) |
проверяет, является ли тип типом указателя (шаблон класса) |
(C++11) |
проверяет, является ли тип указателем на нестатическую функцию-элемент или объект-элемент (шаблон класса) |