Biblioteca de metaprogramación
C++ proporciona servicios de metaprogramación, como rasgos de tipo, aritmética racional en tiempo de compilación y secuencias de enteros en tiempo de compilación.
Contenido
|
[editar] Definiciones
Los siguientes tipos se denominan colectivamente tipos referenciables:
- tipos objeto
- tipos función sin cv ni ref
- tipos referencia
Para cualquier tipo referenciable T
, se puede crear una referencia a él[1].
- ↑ Para los tipos referencia, esto se puede hacer mediante colapso de referencias.
[editar] Rasgos de tipo
Las rasgos de tipo definen interfaces basadas en plantillas de tiempo de compilación para consultar las propiedades de los tipos.
Intentar especializar una plantilla definida en el encabezado <type_traits> y listada en esta página da como resultado un comportamiento no definido, excepto que std::common_type y std::basic_common_reference (desde C++20) se pueden especializar según se requiera en la descripción.
Una plantilla definida en el encabezado <type_traits> se puede instanciar con un tipo incompleto a menos que se especifique lo contrario, a pesar de la prohibición general contra la instanciación de plantillas de la biblioteca estándar con tipos incompletos.
[editar] Clases base
La mayoría de los rasgos de tipo no transformadores deben derivarse de forma pública e inequívoca de std::integral_constant para satisfacer los requisitos de UnaryTypeTrait o BinaryTypeTrait.
Definido en el archivo de encabezado
<type_traits> | |
(C++11) |
Constante en tiempo de compilación del tipo especificado con el valor especificado. (plantilla de clase) |
Se proporcionan dos especializaciones de std::integral_constant para el tipo bool:
Definido en el archivo de encabezado
<type_traits> | |
Tipo | Definición |
true_type
|
std::integral_constant<bool, true> |
false_type
|
std::integral_constant<bool, false> |
[editar] Rasgos de tipo unarios
Los rasgos de tipo unarios se pueden utilizar para consultar las propiedades booleanas de un tipo en tiempo de compilación.
Todas estos rasgos de tipo satisfacen UnaryTypeTrait, la característica base de cada característica de tipo es std::true_type o std::false_type, dependiendo de si se cumple la condición correspondiente.
Categorías de tipo primarias | |
Definido en el archivo de encabezado
<type_traits> | |
(C++11) |
Comprueba si un tipo es void (plantilla de clase) |
(C++14) |
Comprueba si un tipo es std::nullptr_t (plantilla de clase) |
(C++11) |
Comprueba si un tipo T es entero. (plantilla de clase) |
(C++11) |
Comprueba si un tipo T es de punto flotante (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo array (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo enumeración (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo unión (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo clase (pero no un tipo unión). (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo 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 referencia lvalue. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es una referencia rvalue. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un puntero a un objeto miembro no estático (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un puntero a una función miembro no estática (plantilla de clase) |
Categorías de tipo compuestas | |
Definido en el archivo de encabezado
<type_traits> | |
(C++11) |
Comprueba si un tipo es un tipo fundamental (plantilla de clase) |
(C++11) |
Comprueba si un tipo es de tipo aritmético Original: checks if a type is arithmetic type The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es de tipo escalar Original: checks if a type is scalar type The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo objeto (plantilla de clase) |
(C++11) |
Comprueba si un tipo es de tipo compuesto Original: checks if a type is compound type The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es o bien una referencia lvalue o una referencia rvalue (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un puntero a una función miembro no estática o a un objeto miembro no estático. (plantilla de clase) |
Propiedades de tipos | |
Definido en el archivo de encabezado
<type_traits> | |
(C++11) |
Comprueba si un tipo está calificado con el calificador const (plantilla de clase) |
(C++11) |
Comprueba si un tipo está calificado con el calificador volatile (plantilla de clase) |
(C++11) |
Comprueba si un tipo es trivial Original: checks if a type is trivial The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es trivialmente copiable. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo de diseño estándar. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo simple (POD). (plantilla de clase) |
(C++11) |
Comprueba si un tipo es un tipo literal. (plantilla de clase) |
Comprueba si cada bit en la representación de objeto del tipo contribuye a su valor. (plantilla de clase) | |
(C++11) |
Comprueba si un tipo es un tipo de clase que no es una unión y no tiene datos. (plantilla de clase) |
(C++11) |
Comprueba si un tipo es tipo clase polimórfico (plantilla de clase) |
(C++11) |
Comprueba si un tipo es el tipo de clase abstracta Original: checks if a type is abstract class type The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++14) |
Comprueba si un tipo es un tipo de clase final. (plantilla de clase) |
(C++17) |
Comprueba si un tipo es un tipo de agregado. (plantilla de clase) |
(C++23) |
Comprueba si un tipo es un tipo de tiempo de vida implícito. (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 el tipo de aritmética sin signo Original: checks if a type is unsigned arithmetic type The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++20) |
Comprueba si un tipo es un tipo de array de límite conocido. (plantilla de clase) |
(C++20) |
Comprueba si un tipo es un tipo de array de límite desconocido. (plantilla de clase) |
(C++23) |
Comprueba si un tipo es un tipo enumeración con ámbito (plantilla de clase) |
Operaciones admitidas | |
Definido en el archivo de encabezado
<type_traits> | |
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un constructor de argumentos concretos Original: checks if a type has a constructor for specific arguments The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
Comprueba si un tipo tiene un constructor por defecto Original: checks if a type has a default constructor The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) | |
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un constructor de copia Original: checks if a type has a copy constructor The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un constructor de movimiento Original: checks if a type has a move constructor The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un operador de asignación para un argumento específico Original: checks if a type has a assignment operator for a specific argument The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un operador de asignación de copia Original: checks if a type has a copy assignment operator The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un operador de asignación de movimiento Original: checks if a type has a move assignment operator The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un destructor no eliminado (e.g., = delete). (plantilla de clase) |
(C++11) |
Comprueba si un tipo tiene un destructor virtual Original: checks if a type has a virtual destructor The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++17)(C++17)(C++17)(C++17) |
Comprueba si objetos de un tipo pueden intercambiarse con objetos del mismo tipo o diferente tipo. (plantilla de clase) |
Comprueba si una referencia está vinculada a un temporal en la inicialización directa. (plantilla de clase) | |
Comprueba si una referencia está vinculada a un temporal en la inicialización por copia. (plantilla de clase) |
[editar] Consultas de propiedades
Los rasgos de consulta de propiedades se pueden utilizar para consultar las propiedades integrales de un tipo en tiempo de compilación.
Todas estos rasgos de tipo satisfacen UnaryTypeTrait, la característica base de cada característica 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 archivo de 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 array (plantilla de clase) |
(C++11) |
Obtiene el tamaño de un tipo array a lo largo de una dimensión especificada (plantilla de clase) |
[editar] Relaciones de tipos
Los rasgos de relación de tipos se pueden utilizar 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 archivo de encabezado
<type_traits> | |
(C++11) |
Comprueba si dos tipos son los mismos (plantilla de clase) |
(C++11) |
Comprueba si un tipo es derivado de otro tipo (plantilla de clase) |
(C++26) |
Comprueba si un tipo es una base virtual de otro tipo. (plantilla de clase) |
(C++11)(C++20) |
Comprueba si un tipo puede convertirse a otro tipo. (plantilla de clase) |
(C++20) |
Comprueba si dos tipos tienen diseño compatible. (plantilla de clase) |
Comprueba si un tipo es una base (inicial) interconvertible-por-puntero a otro tipo. (plantilla de clase) | |
Comprueba si un tipo puede invocarse (como si lo fuera por std::invoke) con el número de argumentos dado. (plantilla de clase) |
[editar] Transformaciones de tipos
Los rasgos de transformación de tipo transforman un tipo en otro siguiendo algunas reglas predefinidas.
Todas estos rasgos de tipo satisfacen TransformationTrait.
Especificadores de constantitud y volatilidad | |
Definido en el archivo de 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) |
Agrega los especificadores const y/o volatile al tipo dado (plantilla de clase) |
Referencias | |
Definido en el archivo de encabezado
<type_traits> | |
(C++11) |
Elimina la referencia de un tipo dado. (plantilla de clase) |
(C++11)(C++11) |
Añade referencia lvalue o rvalue al tipo dado. (plantilla de clase) |
Modificadores de signo | |
Definido en el archivo de encabezado
<type_traits> | |
(C++11) |
Hace al tipo entero dado con signo (plantilla de clase) |
(C++11) |
Hace al tipo entero dado sin signo (plantilla de clase) |
Arrays | |
Definido en el archivo de encabezado
<type_traits> | |
(C++11) |
Elimina una dimensión del tipo array dado (plantilla de clase) |
(C++11) |
Elimina todas las dimensiones del tipo array dado (plantilla de clase) |
Punteros | |
Definido en el archivo de encabezado
<type_traits> | |
(C++11) |
Elimina el puntero del tipo dado (plantilla de clase) |
(C++11) |
Agrega puntero al tipo dado (plantilla de clase) |
Otras transformaciones | |
Definido en el archivo de encabezado
<type_traits> | |
(C++11) |
Define el tipo adecuado para su uso como almacenamiento sin inicializar para tipos de un tamaño dado (plantilla de clase) |
(C++11) |
Define el tipo adecuado para su uso como almacenamiento sin inicializar para todos los tipos dados (plantilla de clase) |
(C++11) |
Aplica transformaciones de tipo como se cuando pasa un argumento de función por valor (plantilla de clase) |
(C++20) |
Combina std::remove_cv y std::remove_reference. (plantilla de clase) |
(C++11) |
Condicionalmente elimina una sobrecarga de función o especialización de plantilla de la resolución de sobrecargas. (plantilla de clase) |
(C++11) |
Escoge un tipo u otro basado un tipo Booleano en tiempo de compilación (plantilla de clase) |
(C++11) |
Deduce el tipo del resultado de una expresión aritmética mixta (plantilla de clase) |
Determina el tipo común de referencia de un grupo de tipos (plantilla de clase) | |
(C++11) |
Obtiene el tipo subyacente entero para un tipo enumeración dado (plantilla de clase) |
(C++11) |
Deduce el tipo de retorno de una expresión de llamada a la función. (plantilla de clase) |
(C++17) |
Plantilla de alias void variádica. (plantilla de alias) |
(C++20) |
Devuelve el argumento del tipo sin modificarlo. (plantilla de clase) |
[editar] Operaciones lógicas
Los rasgos de los operadores lógicos aplican operadores lógicos a otros rasgos de tipo.
Definido en el archivo de encabezado
<type_traits> | |
(C++17) |
Metafunción variádica de AND lógico. (plantilla de clase) |
(C++17) |
Metafunción variádica de OR lógico. (plantilla de clase) |
(C++17) |
Metafunción NOT lógico. (plantilla de clase) |
[editar] Relaciones de miembros
Definido en el archivo de encabezado
<type_traits> | |
Comprueba si los objetos de un tipo son interconvertibles-por-puntero con el subobjeto especificado de ese tipo. (plantilla de función) | |
(C++20) |
Comprueba si dos miembros especificados se corresponden mutuamente en la subsecuencia inicial común de dos tipos especificados. (plantilla de función) |
[editar] Aritmética racional en tiempo de compilación
El encabezado <ratio> proporciona tipos y funciones para manipular y almacenar razones matemáticas en tiempo de compilación.
[editar] Secuencias de enteros en tiempo de compilación
Definido en el archivo de encabezado
<utility> | |
(C++14) |
Implementa una secuencia de enteros en tiempo de compilación. (plantilla de clase) |