Namespaces
Variants

std:: is_scalar

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
(C++11)
is_scalar
(C++11)
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Определено в заголовочном файле <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 , поведение не определено.

Содержание

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

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

Шаблон вспомогательной переменной

template < class T >
constexpr bool is_scalar_v = is_scalar < 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 >

Примечания

Каждая отдельная область памяти в модели памяти 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() << " 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)
проверяет, является ли тип указателем
(шаблон класса)
проверяет, является ли тип указателем на нестатический член функции или объекта
(шаблон класса)