Spec-Zone.ru › C++

std::is_scalar

Определено в заголовочном файле <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 >
inline 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

См. также

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

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

Spec-Zone.ru

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