En este artículo, aprenderá sobre las plantillas en C ++. Aprenderá a utilizar el poder de las plantillas para la programación genérica.
Las plantillas son características poderosas de C ++ que le permiten escribir programas genéricos. En términos simples, puede crear una sola función o una clase para trabajar con diferentes tipos de datos usando plantillas.
Las plantillas se utilizan a menudo en una base de código más grande con el propósito de reutilizar el código y la flexibilidad de los programas.
El concepto de plantillas se puede utilizar de dos formas diferentes:
- Plantillas de funciones
- Plantillas de clase
Plantillas de funciones
Una plantilla de función funciona de manera similar a una función normal, con una diferencia clave.
Una sola plantilla de función puede funcionar con diferentes tipos de datos a la vez, pero una única función normal solo puede funcionar con un conjunto de tipos de datos.
Normalmente, si necesita realizar operaciones idénticas en dos o más tipos de datos, usa la sobrecarga de funciones para crear dos funciones con la declaración de función requerida.
Sin embargo, un mejor enfoque sería utilizar plantillas de funciones porque puede realizar la misma tarea escribiendo menos código que se pueda mantener.
¿Cómo declarar una plantilla de función?
Una plantilla de función comienza con la plantilla de palabras clave seguida de los parámetros de la plantilla dentro de los cuales sigue la declaración de la función.
plantilla < clase T> T algunaFunción (T arg) (…)
En el código anterior, T es un argumento de plantilla que acepta diferentes tipos de datos (int, float) y class es una palabra clave.
También puede utilizar palabras clave en typename
lugar de clases en el ejemplo anterior.
Cuando se le pasa un argumento de un tipo de datos someFunction( )
, el compilador genera una nueva versión de someFunction()
para el tipo de datos dado.
Ejemplo 1: Plantilla de función para encontrar el número más grande
Programa para mostrar el mayor entre dos números usando plantillas de funciones.
// If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )
Salida
Ingrese dos números enteros: 5 10 10 es mayor. Introduzca dos números de coma flotante: 12,4 10,2 12,4 es mayor. Introduzca dos caracteres: z Z z tiene un valor ASCII mayor.
En el programa anterior, Large()
se define una plantilla de función que acepta dos argumentos n1 y n2 de tipo de datos T
. T
significa que el argumento puede ser de cualquier tipo de datos.
Large()
La función devuelve el mayor de los dos argumentos mediante una operación condicional simple.
Dentro de la main()
función, las variables de tres tipos de datos diferentes: int
, float
y char
se declaran. Luego, las variables se pasan a la Large()
plantilla de función como funciones normales.
Durante el tiempo de ejecución, cuando se pasa un entero a la función de plantilla, el compilador sabe que tiene que generar una Large()
función para aceptar los argumentos int y lo hace.
De manera similar, cuando se pasan datos de punto flotante y datos de caracteres, conoce los tipos de datos de los argumentos y genera la Large()
función en consecuencia.
De esta manera, el uso de una sola plantilla de función reemplazó tres funciones normales idénticas e hizo que su código se pudiera mantener.
Ejemplo 2: intercambiar datos mediante plantillas de funciones
Programa para intercambiar datos usando plantillas de funciones.
#include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; )
Salida
Antes de pasar datos a la plantilla de función. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Después de pasar datos a la plantilla de función. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a
En este programa, en lugar de llamar a una función pasando un valor, se emite una llamada por referencia.
La Swap()
plantilla de función toma dos argumentos y los intercambia por referencia.
Plantillas de clase
Al igual que las plantillas de funciones, también puede crear plantillas de clases para operaciones de clases genéricas.
A veces, necesita una implementación de clase que sea la misma para todas las clases, solo los tipos de datos utilizados son diferentes.
Normalmente, necesitaría crear una clase diferente para cada tipo de datos O crear diferentes variables miembro y funciones dentro de una sola clase.
Esto inflará innecesariamente su código base y será difícil de mantener, ya que un cambio es una clase / función que debe realizarse en todas las clases / funciones.
Sin embargo, las plantillas de clase facilitan la reutilización del mismo código para todos los tipos de datos.
¿Cómo declarar una plantilla de clase?
plantilla < clase T> clase className (… public: T var; T someOperation (T arg);…);
En la declaración anterior, T
el argumento de plantilla es un marcador de posición para el tipo de datos utilizado.
Dentro del cuerpo de la clase, una variable miembro var y una función miembro someOperation()
son ambas de tipo T
.
¿Cómo crear un objeto de plantilla de clase?
Para crear un objeto de plantilla de clase, debe definir el tipo de datos dentro de una creación.
className classObject;
Por ejemplo:
className classObject; className classObject; className classObject;
Ejemplo 3: calculadora simple usando la plantilla de clase
Programa para sumar, restar, multiplicar y dividir dos números usando la plantilla de clase
#include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; )
Salida
Resultados int: Los números son: 2 y 1. La suma es: 3 La resta es: 1 El producto es: 2 La división es: 2 Resultados flotantes: Los números son: 2.4 y 1.2. La suma es: 3.6 La resta es: 1.2 El producto es: 2.88 La división es: 2
En el programa anterior, Calculator
se declara una plantilla de clase .
La clase contiene dos miembros privados de tipo T
: num1 y num2, y un constructor para inicializar los miembros.
It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult()
to display the final output to the screen.
In the main()
function, two different Calculator
objects intCalc
and floatCalc
are created for data types: int
and float
respectively. The values are initialized using the constructor.
Notice we use and
while creating the objects. These tell the compiler the data type used for the class creation.
This creates a class definition each for int
and float
, which are then used accordingly.
Luego, displayResult()
se llama a ambos objetos que realiza las operaciones de la Calculadora y muestra la salida.