templates c with examples
Aprenda los distintos aspectos de las plantillas en C ++.
Las plantillas son una de las características más poderosas de C ++. Las plantillas nos proporcionan el código que es independiente del tipo de datos.
En otras palabras, usando plantillas, podemos escribir un código genérico que funcione con cualquier tipo de datos. Solo necesitamos pasar el tipo de datos como parámetro. Este parámetro que pasa el tipo de datos también se denomina nombre de tipo.
En este tutorial, exploraremos todo sobre las plantillas y sus diversos aspectos en detalle.
=> Haga clic aquí para ver la serie de capacitación Absolute C ++.
Lo que vas a aprender:
- ¿Qué son las plantillas?
- ¿Cómo utilizar plantillas / implementación?
- typename vs. palabra clave de clase
- Creación de instancias y especialización de plantillas
- Especialización en plantillas
- Plantillas Variadic C ++
- Conclusión
- Lectura recomendada
¿Qué son las plantillas?
Como se mencionó anteriormente, las plantillas son genéricas, es decir, independientes del tipo de datos. Las plantillas se utilizan principalmente para garantizar la reutilización del código y la flexibilidad de los programas. Podemos simplemente crear una función simple o una clase que tome el tipo de datos como parámetro e implementar el código que funcione para cualquier tipo de datos.
Por ejemplo, Si queremos que un algoritmo de clasificación funcione para todos los tipos de datos numéricos, así como para las cadenas de caracteres, simplemente escribiremos una función que tome el tipo de datos como argumento e implementaremos la técnica de clasificación.
Luego, dependiendo del tipo de datos (nombre del tipo) que se pasa al algoritmo de clasificación, podemos ordenar los datos independientemente del tipo de datos. De esta forma no es necesario escribir diez algoritmos para diez tipos de datos.
Por lo tanto, las plantillas se pueden usar en aplicaciones en las que requerimos que el código se pueda usar para más de un tipo de datos. Las plantillas también se utilizan en aplicaciones donde la reutilización del código es de primordial importancia.
¿Cómo utilizar plantillas / implementación?
Las plantillas se pueden implementar de dos formas:
cómo abrir un archivo mkv
- Como plantilla de función
- Como plantilla de clase
Plantilla de función
La plantilla de función es como una función normal, pero la única diferencia es que la función normal puede funcionar solo en un tipo de datos y un código de plantilla de función puede funcionar en varios tipos de datos.
Si bien podemos sobrecargar una función normal para trabajar en varios tipos de datos, las plantillas de funciones siempre son más útiles, ya que tenemos que escribir el único programa y puede funcionar con todos los tipos de datos.
A continuación, veremos la implementación de plantillas de funciones.
La sintaxis general de la plantilla de función es:
|_+_|Aquí, T es el argumento de plantilla que acepta diferentes tipos de datos y clase es una palabra clave. En lugar de la clase de palabra clave, también podemos escribir 'typename'.
Cuando se pasa un tipo de datos en particular a function_name, el compilador hace una copia de esta función con este tipo de datos como argumento y se ejecuta la función.
Veamos un ejemplo para comprender mejor las plantillas de funciones.
|_+_|Producción:
Datos originales
num1 = 10 num2 = 20
d1 = 100,53 d2 = 435,54
ch1 = A ch2 = Z
Datos después del intercambio
num1 = 20 num2 = 10
d1 = 435,54 d2 = 100,53
ch1 = Z ch2 = A
En el programa anterior, hemos definido una plantilla de función 'func_swap' que intercambia dos valores. La función toma dos argumentos de referencia de tipo T. Luego intercambia los valores. Como los argumentos son referencias, cualquier cambio que hagamos en los argumentos de la función se reflejará en la función de llamada.
En la función principal, definimos datos de tipo int, double y char. Llamamos a la función func_swap con cada tipo de datos. Luego mostramos los datos intercambiados para cada tipo de datos.
Por tanto, esto muestra que no necesitamos escribir tres funciones para tres tipos de datos. Basta escribir una sola función y convertirla en una función de plantilla para que sea independiente del tipo de datos.
Plantillas de clase
Al igual que en las plantillas de funciones, es posible que tengamos el requisito de tener una clase que sea similar a todos los demás aspectos, pero solo diferentes tipos de datos.
En esta situación, podemos tener diferentes clases para diferentes tipos de datos o diferentes implementaciones para diferentes tipos de datos en la misma clase. Pero hacer esto hará que nuestro código sea voluminoso.
La mejor solución para esto es utilizar una clase de plantilla. La clase de plantilla también se comporta de forma similar a las plantillas de funciones. Necesitamos pasar el tipo de datos como parámetro a la clase mientras creamos objetos o llamamos funciones miembro.
La sintaxis general de la plantilla de clase es:
|_+_|En la definición anterior, T actúa como un marcador de posición para el tipo de datos. MemVar y memFunction de los miembros públicos también usan T como marcador de posición para los tipos de datos.
Una vez que una clase de plantilla se define como anteriormente, podemos crear objetos de clase de la siguiente manera:
|_+_|Implementemos un ejemplo de código para demostrar las plantillas de clase:
|_+_|Producción:
Máximo de 100 y 75 = 100
Máximo de 'A' y 'a' = a
El programa anterior implementa un ejemplo de plantilla de clase. Tenemos la clase de plantilla myclass. Dentro de esto, tenemos un constructor que inicializará los dos miembros ayb de la clase. Hay otra función miembro getMaxval que también es una plantilla de función que devuelve un máximo de ay b.
En la función principal, construimos dos objetos, myobject de tipo integer y mychobject de tipo character. Luego llamamos a la función getMaxval en cada uno de estos objetos para determinar el valor máximo.
Tenga en cuenta que además de los parámetros de tipo de plantilla (parámetros de tipo T), las funciones de plantilla también pueden tener parámetros ordinarios como funciones normales y también valores de parámetros predeterminados.
typename vs. palabra clave de clase
Al declarar la clase de plantilla o función, usamos una de las dos palabras clave class o typename. Estas dos palabras son semánticamente equivalentes y pueden usarse indistintamente.
mejor eliminación de virus para windows 10
Pero en algunos casos, no podemos usar estas palabras como equivalentes. Por ejemplo, cuando usamos tipos de datos dependientes en plantillas como 'typedef', usamos typename en lugar de class.
Además, la palabra clave class debe usarse cuando tenemos que instanciar explícitamente una plantilla.
Creación de instancias y especialización de plantillas
Las plantillas están escritas de forma genérica, lo que significa que es una implementación general independientemente del tipo de datos. Según el tipo de datos proporcionado, necesitamos generar una clase concreta para cada tipo de datos.
Por ejemplo, si tenemos un algoritmo de clasificación de plantilla, podemos generar una clase concreta para clasificación, otra clase para clasificación, etc. Esto se denomina instanciación de la plantilla.
Sustituimos los argumentos de la plantilla (tipos de datos reales) por los parámetros de la plantilla en la definición de la clase de la plantilla.
Por ejemplo,
|_+_|Cuando pasamos el tipo de datos, el compilador sustituye el tipo de datos por 'T' para que el algoritmo de clasificación se convierta en sort.
Cada vez que usamos una clase o función de plantilla, existe la necesidad de una instancia cuando pasamos un tipo de datos en particular. Si esta instancia aún no está presente, el compilador crea una con el tipo de datos en particular. Esta es la instanciación implícita.
Un inconveniente de la instanciación implícita es que el compilador genera clases de instancia solo para los argumentos que se utilizan actualmente. Esto significa que si queremos generar una biblioteca de instancias antes del uso de estas instancias, debemos optar por la instanciación explícita.
A continuación se ofrece un ejemplo de declaración de plantilla:
|_+_|Se puede crear una instancia explícita como:
|_+_|Cuando se crea una instancia de una clase, también se crean instancias de todos sus miembros.
Especialización en plantillas
Mientras programamos usando plantillas, podríamos enfrentarnos a una situación tal que podríamos requerir una implementación especial para un tipo de datos en particular. Cuando ocurre tal situación, optamos por la especialización de plantillas.
En la especialización de plantillas, implementamos un comportamiento especial para un tipo de datos en particular, además de la definición de plantilla original para los otros tipos de datos.
Por ejemplo, considera que tenemos una clase de plantilla ' myIncrement ' que tiene un constructor para inicializar un valor y una función de plantilla toIncrement que incrementa el valor en 1.
Esta clase en particular funcionará perfectamente para todos los tipos de datos excepto para char. En lugar de incrementar el valor de char, ¿por qué no darle un comportamiento especial y convertir el carácter a mayúsculas?
Para hacer esto, podemos optar por la especialización de plantilla para el tipo de datos char.
Esta implementación se muestra en el siguiente ejemplo de código.
|_+_|Producción:
Valor int aumentado: 8
Valor en mayúsculas: S
Valor doble aumentado: 12
En el programa anterior que demuestra la especialización de plantillas, vea la forma en que hemos declarado una plantilla especializada para el tipo char. Primero declaramos la clase original y luego la “especializamos” para el tipo char. Para comenzar la especialización usamos la declaración de plantilla vacía 'plantilla'.
Luego, después del nombre de la clase, incluimos el tipo de datos. Después de estos dos cambios, la clase se escribe para el tipo char.
En la función principal, tenga en cuenta que no hay diferencia entre la instanciación del tipo char y otros tipos. La única diferencia es que redefinimos la clase especializada.
Tenga en cuenta que debemos definir todos los miembros de la clase especializada aunque sean exactamente iguales en la clase de plantilla genérica / original. Esto se debe a que no tenemos una función de herencia para los miembros de la plantilla genérica a la plantilla especializada.
Plantillas Variadic C ++
Hasta ahora hemos visto plantillas de funciones que toman un número fijo de argumentos. También hay plantillas que aceptan un número variable de argumentos. Estas plantillas de funciones se denominan plantillas variadas. Las plantillas variadic son una de las características más nuevas de C ++ 11.
Las plantillas variables toman un número variable de argumentos que son seguros para los tipos y los argumentos se resuelven en tiempo de compilación.
Tomemos un ejemplo de programación completo para entender esto.
|_+_|Producción:
Suma de números largos = 21
Suma de cadenas = Hola
La captura de pantalla del mismo se muestra a continuación.
El ejemplo anterior demuestra la función variada, 'suma'. Como se muestra arriba, primero necesitamos una función base que implemente el caso base. Luego implementamos la función variadica en la parte superior de esta función.
En la suma de la función variable, 'typename ... args' se llama paquete de parámetros de plantilla mientras que 'Args ... args' se llama paquete de parámetros de función .
Después de escribir una plantilla de función que implemente el caso base, escribimos una función variadica que implemente el caso general. La función variadic se escribe de manera similar a la recursividad como se muestra para la suma (args…). El primer argumento se separa del paquete de parámetros de función en el tipo T (primero).
¿Qué son las pruebas beta en las pruebas de software?
Con cada llamada a la suma, la lista de parámetros se reduce en un argumento y, finalmente, se alcanza la condición base. La salida muestra la suma de números enteros y caracteres largos.
Conclusión
Con esto, concluimos este tutorial sobre plantillas en C ++. Las plantillas nos ayudan a hacer que nuestros programas sean genéricos, es decir, independientes del tipo.
Leer también = >> Tutorial de plantilla de matraz
Los programas genéricos siempre están por encima de los demás programas, ya que no es necesario que escribamos programas separados para cada tipo de datos. Por tanto, el desarrollo de programas genéricos con seguridad de tipos puede ser un paso importante hacia una programación eficiente.
=> Consulte los tutoriales de capacitación detallados de C ++ aquí.
Lectura recomendada
- Tutorial de la función principal de Python con ejemplos prácticos
- Cómo funcionan las pruebas basadas en datos (ejemplos de QTP y selenio)
- Multithreading en C ++ con ejemplos
- Tutorial de Python DateTime con ejemplos
- Plantilla de caso de prueba de muestra con ejemplos de casos de prueba (Descargar)
- Cortar comando en Unix con ejemplos
- Plantilla de muestra para el informe de prueba de aceptación con ejemplos
- Sintaxis del comando Unix Cat, opciones con ejemplos