El concepto es una extensión de interfaz para las plantillas de lenguaje C++ publicadas en la especificación técnica ISO/IEC ISO TS 19217:2015 [1] . En esencia , un concepto es un conjunto de predicados booleanos ubicados detrás de una lista de parámetros de plantilla que se evalúan en el momento de la compilación del código fuente para establecer restricciones sobre las propiedades de los argumentos que se aceptan como parámetros de plantilla [2] .
La introducción de conceptos está asociada con el desarrollo posterior en el lenguaje C++ de herramientas basadas en el paradigma de programación genérico [2] . Un concepto se puede declarar con cualquier tipo de plantilla ( clase de plantilla, plantilla de función o función de miembro de plantilla), su propósito es detectar inconsistencias lógicas entre las propiedades de los tipos de datos que se usan dentro del cuerpo de la plantilla y las propiedades de los datos. tipos que vienen en patrón como entradas [2] [3] .
Antes de su introducción en el lenguaje estándar, la noción de un concepto se implementó en la biblioteca de uso general de Boost en forma de clases de biblioteca BCCL ( Boost Concept Checking Library ) [4] .
Definición del concepto.
plantilla < claseT > _ concepto Igualdad Comparable () { requiere ( T a , T b ) { { a == b } -> Booleano ; // Un concepto que significa un tipo para convertir a booleano { a != b } -> Boolean ; }; }Una plantilla que utiliza el concepto (tenga en cuenta que no hay una palabra clave de plantilla).
void f ( const Igualdad Comparable auto & );Los conceptos intervendrán en la elección de qué función aplicar del conjunto de sobrecargas, junto con SFINAE . El compilador preferirá el concepto "más difícil".
Si usa el concepto en un inicializador, será similar a auto, pero el código se compilará si se admite el concepto.
Ordenable automáticamente x = f ( y ); // análogo de auto x = f(y), compilado si el resultado es un tipo adecuado para SortableEn la programación genérica, un concepto es un conjunto de requisitos para un tipo para que el patrón de programación genérico tenga sentido. Por ejemplo, la plantilla asume dichas relaciones entre los tipos de iterador It1 e It2. It2 std::copy(It1, It1, It2)
Estos conceptos se describen en la documentación de C++ y son una descripción verbal de las condiciones cuando se compila el código. Por ejemplo, si intenta especializar una plantilla con parámetros , el It1=int*, It2=int**compilador informará que la asignación no es posible int* ← int. Sin embargo, hay desventajas.
Además, hay que realizar funciones que aparecen o desaparecen en función de unas condiciones (conformidad o inconsistencia del concepto ). En C++17 , las plantillas para esto son complicadas.
Hasta el día de hoy, los conceptos solo se han descrito sintácticamente de forma limitada; por ejemplo, en Java , el papel de los conceptos lo desempeñan declaraciones como class Test <T extends Testable>.
Compilador | Parcialmente | Completamente |
---|---|---|
G++ | 6 | diez |
MSVC | 2019 | No todavía |
Sonido metálico | diez | No todavía |