Spec-Zone.ru › C++

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

См. также

is_arithmetic
(C++11)
проверяет, является ли тип арифметическим
(шаблон класса)
is_enum
(C++11)
проверяет, является ли тип перечислением
(шаблон класса)
is_pointer
(C++11)
проверяет, является ли тип типом указателя
(шаблон класса)
is_member_pointer
(C++11)
проверяет, является ли тип указателем на нестатическую функцию-член или объект
(шаблон класса)
is_scalar_type
(C++26)
проверяет, является ли отражённый тип скалярным
(функция)

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

Spec-Zone.ru

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