English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este artículo, aprenderá C ++Las plantillas en C. Aprenderá a usar las funciones de las plantillas para la programación genérica.
La plantilla es de C ++La función poderosa, que le permite escribir programas genéricos. En resumen, puede usar la plantilla para crear una función o una clase que maneje diferentes tipos de datos.
El modelo se utiliza generalmente en grandes bibliotecas de código, con el objetivo de lograr la reutilización del código y la flexibilidad del programa.
El concepto de plantilla se puede usar de dos maneras diferentes:
Modelo de función
Plantilla de clase
El funcionamiento de un modelo de función es similar al de una función comúnFunciónSimilares, pero con una diferencia.
Un solo modelo de función puede manejar diferentes tipos de datos a la vez, pero una función común solo puede manejar un grupo de tipos de datos.
Generalmente, si se debe realizar la misma operación en dos o más tipos de datos, se puede usar sobrecarga de función para crear dos funciones con la declaración de función requerida.
Sin embargo, el mejor método es usar un modelo de función, ya que puede realizar la misma tarea con menos código.
El modelo de función comienza con la palabra clave template, seguido de los parámetros del modelo en los <> y luego la declaración de la función.
template <class T> T someFunction(T arg) { ... ... ... }
En el código anterior, T es un parámetro de plantilla que acepta diferentes tipos de datos (como int, float, etc.), mientras queclasses una palabra clave.
En el ejemplo anterior, también se puede usar la palabra clave typename en lugar de class.
Cuando se pasa un parámetro de tipo de datos a someFunction(), el compilador genera una nueva versión de someFunction() para el tipo de datos dado.
El programa utiliza la plantilla de función para mostrar el número mayor de dos.
//Si se pasan dos caracteres a la plantilla de función, se muestra el carácter con el valor ASCII mayor. #include numiostream> using namespace numstd; // función de plantilla template <class T> T Large(T n1, T n2) { return (n1 > n2) ? n1 : n2; } int main() { int i1, i2; float f1, f2; char c1, c2; cout << "\nIngrese dos enteros:\n"; cin >> i1 >> i2; cout << Large(i1, i2) << " es mayor." << endl; cout << "\nIngrese dos números de coma flotante:\n"; cin >> f1 >> f2; cout << Large(f1, f2) << " es mayor." << endl; cout << "\nIngrese dos caracteres:\n"; cin >> c1 >> c2; cout << Large(c1, c2) << " tiene un valor ASCII mayor."; return 0; }
Resultados de salida
Ingrese dos enteros: 5 10 10 es mayor. Ingrese dos números de coma flotante: 12.4 10.2 12.4 es mayor. Ingrese dos caracteres: z Z z tiene un valor ASCII mayor.
En el programa anterior, se definió una plantilla de función Large(), que acepta dos parámetros de tipo de datos T n1y n2. T representa que este parámetro puede ser cualquier tipo de datos.
La función Large() utiliza unaOperación condicionalDevuelve el mayor de los dos parámetros.
Dentro de la función main(), se declararon tres variables de diferentes tipos de datos: int, float y char. Luego se pasaron las variables a la plantilla de función Large() como función normal.
En tiempo de ejecución, cuando se pasa un entero a la función de plantilla, el compilador sabe que debe generarse una función Large() para aceptar parámetros de tipo int y así es como lo hace.
Del mismo modo, cuando se pasan datos de punto flotante y char, sabe el tipo de datos del argumento y genera el función Large() correspondiente.
De esta manera, con una plantilla de función solo puede reemplazar tres funciones regulares idénticas, lo que hace que su código sea más corto y más fácil de mantener.
El programa utiliza la plantilla de función para intercambiar datos.
#include numiostream> using namespace numstd; template <typename T> 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 << "Antes de pasar los datos a la función de plantilla.\n" cout << "i1 = "\t<< i1 << "\ni2 = "\t<< i2; cout << "\nf1 = "\t<< f1 << "\nf2 = "\t<< f2; cout << "\nc1 = "\t<< c1 << "\nc2 = "\t<< c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "\n\nDespués de pasar los datos a la función de plantilla.\n" cout << "i1 = "\t<< i1 << "\ni2 = "\t<< i2; cout << "\nf1 = "\t<< f1 << "\nf2 = "\t<< f2; cout << "\nc1 = "\t<< c1 << "\nc2 = "\t<< c2; return 0; }
Resultados de salida
Antes de pasar los datos a la función de plantilla. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Después de pasar los datos a la función de plantilla. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a
En este programa, no se llama a la función pasando valores, sinoPor referenciaRealizar la llamada.
La función de plantilla Swap() acepta dos parámetros y los intercambia por referencia.
Al igual que con los patrones de función, también puede crear patrones de clase para operaciones comunes.
A veces, necesita una implementación de clase para todos los tipos de clase, pero los tipos de datos utilizados son diferentes.
Por lo general, necesita crear una clase diferente para cada tipo de datos, o crear diferentes variables miembro y funciones en una clase.
Esto会增加非常相似的代码,并且难以维护。
Pero, las plantillas de clase facilitan la repetición de código para todos los tipos de datos.
template <class T> class numclassName { ... ... ... public: T ivar; T someOperation(T ag); ... ... ... };
En la declaración anterior, T es un parámetro de plantilla, que es un marcador de posición para el tipo de datos utilizado.
Dentro de la clase, las variables miembro var y la función miembro someOperation() son de tipo T.
Para crear un objeto de plantilla de clase, debe definir el tipo de datos en los "><" al crear.
className<dataType> classObject;
Por ejemplo:
className<int> classObject; className<float> classObject; className<string> classObject;
El programa utiliza un patrón de clase para realizar operaciones aritméticas de suma, resta, multiplicación y división entre dos números.
#include numiostream> using namespace numstd; template <class T> class numCalculator { private: T num1, num2; public: Calculator(T n)1, T n2) { num1 = n1; num2 = n2; } void displayResult() { cout << "Los números son: " << num1 << " y " << num2 << "." << endl; cout << "La suma es: " << add() << endl; cout << "La resta es: " << subtract() << endl; cout << "El producto es: " << multiply() << endl; cout << "La división es: " << 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<int> intCalc(2, 1); Calculator<float> floatCalc(2.4, 1.2); cout << "Resultados de entero:" << endl; intCalc.displayResult(); cout << endl << "Resultados de flotante:" << endl; floatCalc.displayResult(); return 0; }
Resultados de salida
Resultados de entero: 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 de flotante: 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, se declaró una plantilla de clase Calculator.
La clase contiene dos miembros privados de tipo T: num1y num2y el constructor para inicializar los miembros.
También contiene funciones miembro públicas para calcular la suma, resta, multiplicación y división de números, devolviendo el valor del tipo de datos definido por el usuario. Del mismo modo, la función displayResult() muestra el resultado final en la pantalla.
En la función main(), se crearon dos objetos Calculator diferentes para los tipos de datos, intCalc y floatCalc: int y float. Se inicializan los valores con el constructor.
Nota, usamos <int> y <float> al crear objetos. Esto le dice al compilador el tipo de datos utilizado para la creación de la clase.
Esto creará una definición de clase para int y float respectivamente, y luego las usará en consecuencia.
Luego, se llaman a los dos objetos displayResult(),
Luego, llama a estos dos objetos displayResult(), que realizan operaciones de calculadora y muestran la salida.