Diferencia entre directivas de preprocesador y plantillas de funciones en C++

Las directivas de preprocesador son programas que procesan nuestro código fuente antes de la compilación. Hay una serie de pasos involucrados entre escribir un programa y ejecutar un programa en C/C++.

A continuación se muestra el programa para ilustrar la funcionalidad de las plantillas de funciones:

C++

// C++ program to illustrate
// preprocessor directives
#include <bits/stdc++.h>
  
#define min(a, b) ((a < b) ? a : b)
  
using namespace std;
  
// Driver code
int main()
{
    int a = 2, b = 4;
  
    // Find the minimum of a and b
    cout << "Minimum of both is: "
         << min(a, b);
  
    return 0;
}
Producción:

Minimum of both is: 2

Las plantillas de función son la función genérica que puede manejar diferentes tipos de datos sin necesidad de ningún código separado.

A continuación se muestra el programa para ilustrar la funcionalidad de las plantillas de funciones:

C++

// C++ program to illustrate the use
// of Function Templates
#include <iostream>
#include <stdio.h>
using namespace std;
  
// Function Template
template <class T>
T Min(T x, T y)
{
    return (x < y) ? x : y;
}
  
// Driver Code
int main()
{
    int a = 4, b = 8;
  
    // Find the minimum of a and b
    cout << "Minimum of both is: " << min(a, b);
  
    return 0;
}
Producción:

Minimum of both is: 4

Las plantillas de función se utilizan para crear funciones genéricas que pueden funcionar con cualquier tipo de datos . Por ejemplo, la plantilla de función utilizada para calcular el mínimo de 2 valores de cualquier tipo se puede definir como:

template <class T>
T minimum(T a, T b)
{
   return (a < b) ? a : b;
}

Pero esta tarea también se puede realizar usando directivas de preprocesador creadas usando la directiva de preprocesador #define . Entonces, el mínimo de los dos números se puede definir como:

#define minimum(a, b) ((a < b) ? a : b)

Las directivas de preprocesador también se pueden lograr utilizando las siguientes declaraciones:

minimum(30, 35);
minimum(30.5, 40.5);

En C++ , la mayoría de nosotros preferimos usar plantillas en lugar de directivas de preprocesador porque:

  • En el caso de las directivas de preprocesador, no hay verificación de tipos. Pero en el caso de las plantillas, el compilador realiza la verificación completa del tipo.
  • Las directivas de preprocesador pueden llamar a un resultado inesperado. Considere una macro que calcula el cuadrado de cualquier número como:
#define sqr(x) (x*x)
  • Ahora, si se llama a esta macro usando la siguiente instrucción, x = sqr(4 + 4); entonces la salida esperada es 64 pero genera 24 porque cualquier x en el cuerpo de la macro se reemplaza por 4 + 4 lo que lleva a x = 4 + 4 * 4 + 4 = 24 pero en el caso de las plantillas, no se obtienen resultados tan inesperados.

A continuación se muestra la diferencia tabular entre los dos:

S. No. Directivas del pre procesador Plantillas de funciones
1 No hay verificación de tipo Hay verificación de tipo completo
2 son preprocesados ellos son compilados
3 Pueden trabajar con cualquier tipo de datos. Se utilizan con directivas de preprocesador #define
4 Pueden causar un resultado inesperado No se obtienen tales resultados inesperados.
5 No garantizan la seguridad del tipo en la instancia. Garantizan la seguridad del tipo.
6 Tienen especialización completa explícita. No tienen una especialización completa explícita.

Publicación traducida automáticamente

Artículo escrito por tarunsinghwap7 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *