#include using namespace std; // Esta macro permite obtener el minimo pero no verifica tipos lo que es inadecuado // Las macros del preprocesador permite hacer metaprogramacion en C/C++ #define min(a,b) ((a) < (b) ? (a) : (b)) // Esta es una funcion libre plantilla. No es realmente una funcion, sino un molde // para construir funciones. C++ utilizara esta plantilla para construir funciones // a demanda conforme se usen en el programa; esto en tiempo de compilacion template TipoDato minimo(TipoDato a, TipoDato b) { return a < b ? a : b; } // El 'template ' declara TipoDato como un tipo de datos // generico. C++ lo reemplazara por el tipo adecuado cuando se utilice la // plantilla para construir una funcion particular. Notese que la declaracion // de TipoDato solo esta disponible para la funcion que le sigue. Es decir el // TipoDato declarado anteriormente solo esta disponible para la plantilla // minimo() y maximo() no puede utilizarla; sino que maximo debe definir su // propio TipoDato template TipoDato maximo(TipoDato a, TipoDato b) { return a > b ? a : b; } // Prueba una de las plantillas para construir funciones int main() { long long a = 0; cout << "a: "; cin >> a; long long b = 0; cout << "b: "; cin >> b; // Cuando C++ ve minimo(a,b) no puede invocar a la plantilla // minimo(TipoDato, TipoDato). Una plantilla no es una funcion. Es solo una // plantilla para construir funciones con diferentes tipos de datos. C++ // entonces genera una funcion libre minimo(double, double) con esa plantilla // automaticamente y la utiliza en la siguiente invocacion cout << "minimo(" << a << ", " << b << ") = " << minimo(a,b) << endl; // Si usamos la plantilla con otro tipo de datos (double) C++ creara otra // funcion, en este caso, minimo(double, double) e invoca esa funcion generada // en la siguiente linea cout << "minimo(" << a << ", " << b << ") = " << minimo((double)a,(double)b) << endl; // Esto no generara una nueva funcion minimo(double, double), sino que C++ // reutilizara la que ya se creo previamente cout << "minimo(-0.01, -0.1) = " << minimo(-0.01, -0.1) << endl; // A este punto nunca se utilizo la funcion maximo(), por lo que C++ nunca // expandio la plantilla maximo(TipoDato, TipoDato) return 0; }