stringtranslate.com

Concepto (programación genérica)

En programación genérica , un concepto es una descripción de las operaciones admitidas en un tipo , incluidas la sintaxis y la semántica. De esta manera, los conceptos se relacionan con tipos abstractos pero los conceptos no requieren una relación de subtipo.

El uso del lenguaje

El término ya se utilizaba en 1998 para STL , [1] ya que fue una de las primeras bibliotecas que utilizó plantillas de forma extensiva. El término concepto (y su popularización) se atribuye a Alexander Stepanov , [2] [3] el diseñador principal del STL.

En el estándar C++ 1998, el término Concepto se introdujo para nombrar simplemente una descripción simple de los requisitos para un tipo particular, que generalmente es un parámetro de plantilla. No estaba codificado explícitamente en el lenguaje; el concepto se expresaba únicamente mediante las operaciones que se intentaban en objetos de ese tipo y lo que se esperaba que funcionara (es decir, que se compilara correctamente). Hubo una propuesta para agregar conceptos como una característica explícita del lenguaje en C++11 , aunque fue rechazada por "no estar lista". C++20 finalmente aceptó el diseño refinado del concepto.

Como los genéricos en Java y C# tienen algunas similitudes con las plantillas de C++ , el papel de los conceptos lo desempeñan las interfaces . Sin embargo, existe una diferencia importante entre conceptos e interfaces: cuando se requiere un parámetro de plantilla para implementar una interfaz en particular, el tipo coincidente solo puede ser una clase que implemente (explícitamente) esa interfaz. Los conceptos aportan más flexibilidad porque pueden satisfacerse de dos maneras:

Pero el lenguaje C# tiene varias construcciones en las que el tipo utilizado no necesita implementar explícitamente una interfaz definida, solo se requiere que coincida con el patrón respectivo (sin embargo, estos patrones no se denominan conceptos ). Por ejemplo, la foreachdeclaración de iteración permite que el objeto iterado sea de cualquier tipo, siempre que implemente un GetEnumeratormétodo apropiado. [4] (Compárese con la usingdeclaración que requiere que el recurso implemente la System.IDisposableinterfaz. [5] )

El lenguaje de programación Nim implementa conceptos como una serie de predicados booleanos arbitrarios en tiempo de compilación. [6]

Otro lenguaje que implementa algo muy similar a los conceptos es Haskell , donde la característica se llama clases de tipos .


Ejemplos

Pedido total

El concepto de orden total describe la semántica del <operador. Un tipo está totalmente ordenado cuando <es un predicado binario y satisface las siguientes propiedades: [7] [8]

Muchos algoritmos dependen de estas propiedades para funcionar correctamente. Por ejemplo, la minfunción se puede definir de forma segura en tipos totalmente ordenados:

#include <conceptos> plantilla < nombre de tipo T > requiere std :: totalmente_ordenado < T > T min ( T a , T b ) { // < está definido. si ( b < a ) { return b ; } else { // !(b < a) implica a == b o a < b return a ; } }                         

Iterador

Si un tipo Isatisface el concepto Trivial Iterator en C++ y ies de tipo I, las siguientes son expresiones válidas con la semántica correspondiente: [9]

Ver también

Referencias

  1. ^ Austern, MH Programación genérica y STL: uso y ampliación de la biblioteca de plantillas estándar de C++ . 1998. págs. 17-18
  2. ^ un poco de información general sobre conceptos y C ++ 17: Bjarne Stroustrup, por Bjarne Stroustrup | 26 de febrero de 2016
  3. ^ Alex Stepanov, por Bjarne Stroustrup | 21 de enero de 2016
  4. ^ Borrador de especificación de C# 6.0, declaración foreach
  5. ^ Borrador de especificación de C# 6.0, declaración de uso
  6. ^ "Características experimentales de Nim". nim-lang.org . Consultado el 19 de junio de 2023 .
  7. ^ Stepanov, Alejandro (2009). Elementos de Programación . Profesional de Addison-Wesley. pag. 49.ISBN 9780321635372.
  8. ^ Pedidos totales: programación eficiente con componentes
  9. ^ Iterador trivial

enlaces externos