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
Definido en el encabezado <type_traits>
template < class T >
struct is_scalar ;
(desde C++11)

std::is_scalar es un UnaryTypeTrait .

Si T es un tipo escalar , proporciona la constante miembro value igual a true . Para cualquier otro tipo, value es false .

Si el programa añade especializaciones para std::is_scalar o std::is_scalar_v , el comportamiento es indefinido.

Contenidos

Parámetros de plantilla

T - un tipo a verificar

Plantilla de variable auxiliar

template < class T >
constexpr bool is_scalar_v = is_scalar < T > :: value ;
(desde C++17)

Heredado de std:: integral_constant

Constantes miembro

value
[static]
true si T es un tipo escalar, false en caso contrario
(constante miembro pública estática)

Funciones miembro

operator bool
convierte el objeto a bool , devuelve value
(función miembro pública)
operator()
(C++14)
devuelve value
(función miembro pública)

Tipos miembro

Tipo Definición
value_type bool
type std:: integral_constant < bool , value >

Notas

Cada ubicación de memoria individual en el modelo de memoria de C++, incluyendo las ubicaciones de memoria ocultas utilizadas por características del lenguaje (por ejemplo, el puntero de tabla virtual), tiene tipo escalar (o es una secuencia de campos de bits adyacentes de longitud no nula). La secuenciación de efectos secundarios en la evaluación de expresiones, la sincronización entre hilos, y el ordenamiento de dependencias están todos definidos en términos de objetos escalares individuales.

Implementación posible

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>
{};

Ejemplo

#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);
}

Salida posible:

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

Véase también

verifica si un tipo es un tipo aritmético
(plantilla de clase)
(C++11)
verifica si un tipo es un tipo enumeración
(plantilla de clase)
(C++11)
verifica si un tipo es un tipo puntero
(plantilla de clase)
verifica si un tipo es un puntero a una función miembro no estática u objeto
(plantilla de clase)