Metaprogramming library (since C++11)
C++ proporciona facilidades de metaprogramación, tales como rasgos de tipo, aritmética racional en tiempo de compilación y secuencias de enteros en tiempo de compilación.
Contenidos
|
Definiciones
Los siguientes tipos se denominan colectivamente referenceable types :
- tipos de objeto
- tipos de función sin cv y ref
- tipos de referencia
Para cualquier tipo referenciable
T
, se puede crear una referencia a él
[1]
.
- ↑ Para tipos de referencia, esto puede realizarse mediante reference collapsing .
Rasgos de tipo
Los rasgos de tipo definen interfaces basadas en plantillas en tiempo de compilación para consultar las propiedades de los tipos.
Intentar especializar una plantilla definida en el <type_traits> header y listada en esta página resulta en comportamiento indefinido, excepto que std::common_type y std::basic_common_reference (desde C++20) pueden ser especializadas según se requiera en la descripción.
Una plantilla definida en el <type_traits> puede ser instanciada con un tipo incompleto a menos que se especifique lo contrario, no obstante la prohibición general de instanciar plantillas de la biblioteca estándar con tipos incompletos.
Clases base
La mayoría de los rasgos de tipo no transformadores necesitan derivarse pública y unívocamente de std::integral_constant para satisfacer los requisitos de UnaryTypeTrait o BinaryTypeTrait .
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
(C++17)
|
constante en tiempo de compilación de tipo especificado con valor especificado
(plantilla de clase) |
Se proporcionan dos especializaciones de std::integral_constant para el tipo bool :
|
Definido en el encabezado
<type_traits>
|
|
| Tipo | Definición |
true_type
|
std:: integral_constant < bool , true > |
false_type
|
std:: integral_constant < bool , false > |
Rasgos de tipo unarios
Los rasgos de tipo unarios pueden utilizarse para consultar las propiedades booleanas de un tipo en tiempo de compilación.
Todos estos rasgos de tipo satisfacen UnaryTypeTrait , la característica base de cada rasgo de tipo es std::true_type o std::false_type , dependiendo de si se cumple la condición correspondiente.
Categorías primarias de tipos |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
|
comprueba si un tipo es
void
(plantilla de clase) |
|
(C++11)
(
DR*
)
|
comprueba si un tipo es
std::nullptr_t
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es un tipo integral
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es un tipo de punto flotante
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un tipo array
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es un tipo de enumeración
(class template) |
|
(C++11)
|
verifica si un tipo es un tipo unión
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es un tipo de clase no-union
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es un tipo de función
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un tipo puntero
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es una
lvalue reference
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es una
rvalue reference
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es un puntero a miembro de objeto no estático
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un puntero a función miembro no estática
(plantilla de clase) |
Categorías de tipos compuestos |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
|
verifica si un tipo es un tipo fundamental
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un tipo aritmético
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un tipo escalar
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un tipo objeto
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es un tipo compuesto
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es una
lvalue reference
o una
rvalue reference
(class template) |
|
(C++11)
|
comprueba si un tipo es un puntero a una función miembro no estática o a un objeto
(plantilla de clase) |
Propiedades de tipo |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
|
comprueba si un tipo está calificado como const
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo está calificado como volatile
(plantilla de clase) |
|
(C++11)
(obsoleto en C++26)
|
verifica si un tipo es trivial
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es trivialmente copiable
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un
standard-layout
type
(plantilla de clase) |
|
(C++11)
(deprecated in C++20)
|
verifica si un tipo es un tipo de datos simple (POD)
(plantilla de clase) |
|
(C++11)
(obsoleto en C++17)
(eliminado en C++20)
|
verifica si un tipo es un literal type
(plantilla de clase) |
|
verifica si cada bit en la representación de objeto del tipo contribuye a su valor
(plantilla de clase) |
|
|
(C++11)
|
verifica si un tipo es una clase (pero no unión) y no tiene miembros de datos no estáticos
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es un tipo de clase polimórfica
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un tipo de clase abstracta
(plantilla de clase) |
|
(C++14)
|
verifica si un tipo es un tipo de clase final
(plantilla de clase) |
|
(C++17)
|
verifica si un tipo es un tipo agregado
(plantilla de clase) |
|
(C++23)
|
verifica si un tipo es un tipo de duración implícita
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un tipo aritmético con signo
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un tipo aritmético sin signo
(plantilla de clase) |
|
(C++20)
|
verifica si un tipo es un tipo de array con límite conocido
(plantilla de clase) |
|
(C++20)
|
comprueba si un tipo es un tipo array de límite desconocido
(plantilla de clase) |
|
(C++23)
|
comprueba si un tipo es un tipo de enumeración con ámbito
(plantilla de clase) |
Operaciones soportadas |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo tiene un constructor para argumentos específicos
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo tiene un constructor por defecto
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo tiene un constructor de copia
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo puede ser construido desde una referencia a valor temporal
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo tiene un operador de asignación para un argumento específico
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo tiene un operador de asignación de copia
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo tiene un operador de asignación de movimiento
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo tiene un destructor no eliminado
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo tiene un destructor virtual
(plantilla de clase) |
|
(C++17)
(C++17)
(C++17)
(C++17)
|
verifica si objetos de un tipo pueden intercambiarse con objetos del mismo o diferente tipo
(plantilla de clase) |
|
verifica si una referencia está vinculada a un temporal en inicialización directa
(plantilla de clase) |
|
|
verifica si una referencia está vinculada a un temporal en inicialización por copia
(plantilla de clase) |
|
Consultas de propiedades
Los rasgos de consulta de propiedades pueden utilizarse para consultar las propiedades integrales de un tipo en tiempo de compilación.
Todos estos rasgos de tipo satisfacen
UnaryTypeTrait
, la característica base de cada rasgo de tipo es
std::
integral_constant
<
std::
size_t
, Value
>
, donde
Value
es el resultado de la consulta de la propiedad correspondiente.
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
|
obtiene los requisitos de alineación del tipo
(plantilla de clase) |
|
(C++11)
|
obtiene el número de dimensiones de un tipo de arreglo
(plantilla de clase) |
|
(C++11)
|
obtiene el tamaño de un tipo de arreglo a lo largo de una dimensión especificada
(plantilla de clase) |
Relaciones de tipos
Los rasgos de relación de tipos pueden utilizarse para consultar relaciones entre tipos en tiempo de compilación.
Todos estos rasgos de tipo satisfacen BinaryTypeTrait , la característica base de cada rasgo de tipo es std::true_type o std::false_type , dependiendo de si se cumple la condición correspondiente.
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
|
verifica si dos tipos son iguales
(plantilla de clase) |
|
(C++11)
|
verifica si un tipo es base de otro tipo
(plantilla de clase) |
|
(C++26)
|
verifica si un tipo es una base virtual de otro tipo
(plantilla de clase) |
|
(C++11)
(C++20)
|
verifica si un tipo puede convertirse a otro tipo
(plantilla de clase) |
|
(C++20)
|
verifica si dos tipos son
layout-compatible
(plantilla de clase) |
|
verifica si un tipo es una
pointer-interconvertible
base (inicial) de otro tipo
(plantilla de clase) |
|
|
verifica si un tipo puede ser invocado (como si por
std::invoke
) con los tipos de argumentos dados
(plantilla de clase) |
|
Transformaciones de tipos
Los rasgos de transformación de tipos transforman un tipo en otro siguiendo algunas reglas predefinidas.
Todos estos rasgos de tipo satisfacen TransformationTrait .
Especificadores de const-volatilidad |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
(C++11)
(C++11)
|
elimina los especificadores
const
y/o
volatile
del tipo dado
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
añade
const
y/o
volatile
al tipo especificado
(plantilla de clase) |
Referencias |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
|
elimina una referencia del tipo dado
(plantilla de clase) |
|
(C++11)
(C++11)
|
añade una referencia
lvalue
o
rvalue
al tipo dado
(plantilla de clase) |
Modificadores de signo |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
|
obtiene el tipo con signo correspondiente para el tipo integral dado
(plantilla de clase) |
|
(C++11)
|
obtiene el tipo con signo correspondiente para el tipo integral dado
(plantilla de clase) |
Arreglos |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
|
elimina una dimensión del tipo de arreglo dado
(plantilla de clase) |
|
(C++11)
|
elimina todos los niveles de dimensión del tipo de array dado
(plantilla de clase) |
Punteros |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(C++11)
|
elimina un puntero del tipo dado
(plantilla de clase) |
|
(C++11)
|
añade un puntero al tipo dado
(plantilla de clase) |
Otras transformaciones |
|
|
Definido en el encabezado
<type_traits>
|
|
|
(since C++11)
(deprecated in C++23)
|
define el tipo adecuado para usar como almacenamiento no inicializado para tipos de tamaño dado
(plantilla de clase) |
|
(desde C++11)
(obsoleto en C++23)
|
define el tipo adecuado para usar como almacenamiento no inicializado para todos los tipos dados
(plantilla de clase) |
|
(C++11)
|
aplica transformaciones de tipos como cuando se pasa un argumento de función por valor
(class template) |
|
(C++20)
|
combina
std::remove_cv
y
std::remove_reference
(plantilla de clase) |
|
(C++11)
|
elimina condicionalmente
una sobrecarga de función
o especialización de plantilla de la resolución de sobrecarga
(plantilla de clase) |
|
(C++11)
|
elige un tipo u otro basado en un booleano en tiempo de compilación
(plantilla de clase) |
|
(C++11)
|
determina el tipo común de un grupo de tipos
(plantilla de clase) |
|
determina el tipo de referencia común de un grupo de tipos
(plantilla de clase) |
|
|
(C++11)
|
obtiene el tipo entero subyacente para un tipo de enumeración dado
(plantilla de clase) |
|
(C++11)
(eliminado en C++20)
(C++17)
|
deduce el tipo de resultado de invocar un objeto invocable con un conjunto de argumentos
(plantilla de clase) |
|
(C++17)
|
plantilla de alias variádica void
(plantilla de alias) |
|
(C++20)
|
devuelve el argumento de tipo sin cambios
(plantilla de clase) |
Operaciones lógicas (desde C++17)
Los rasgos de operadores lógicos aplican operadores lógicos a otros rasgos de tipo.
|
Definido en el encabezado
<type_traits>
|
|
|
(C++17)
|
metafunción AND lógica variádica
(plantilla de clase) |
|
(C++17)
|
metafunción OR lógica variádica
(plantilla de clase) |
|
(C++17)
|
metafunción NOT lógica
(plantilla de clase) |
Relaciones de miembros (desde C++20)
|
Definido en el encabezado
<type_traits>
|
|
|
verifica si los objetos de un tipo son
pointer-interconvertible
con el subobjeto especificado de ese tipo
(plantilla de función) |
|
|
(C++20)
|
verifica si dos miembros especificados se corresponden entre sí en la subsecuencia inicial común de dos tipos especificados
(plantilla de función) |
Aritmética racional en tiempo de compilación
El encabezado <ratio> proporciona tipos y funciones para manipular y almacenar ratios en tiempo de compilación .
Secuencias de enteros en tiempo de compilación (desde C++14)
|
Definido en el encabezado
<utility>
|
|
|
(C++14)
|
implementa secuencia de enteros en tiempo de compilación
(plantilla de clase) |