// test.cpp - Plantilla de función
#include "fecha.h"
#include <iostream>
#include <vector>
using namespace std;

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

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

double menor(double a, double b)
{
  return (a < b) ? a : b;
}

template<> char *menor(char *a, char *b)
{
  return (strcmp(a, b) < 0) ? a : b;
}

template<class T> T *menor(T *a, T *b)
{
  return (strcmp(a, b) < 0) ? a : b;
}

template<class T> T *asignarMem(int tam)
{
  T *p = 0;
  try
  {
    p = new T[tam];
    memset(p, 0, tam * sizeof(T));
  }
  catch (bad_alloc)
  {
    cout << "Insuficiente memoria\n";
    exit(-1);
  }
  return p;
}
/*
template<class T> void asignarMem(T **p, int tam)
{
  try
  {
    *p = new T[tam];
    memset(*p, 0, tam * sizeof(T));
  }
  catch (bad_alloc)
  {
    cout << "Insuficiente memoria\n";
    exit(-1);
  }
}
*/
int main()
{
  // Deducción de los valores de los parámetros
  int m = 10, n = 27;
  CFecha f1(20), f2(15);

  int r = menor(m, n);
  CFecha f = menor(f1, f2);
  cout << r << endl;
  cout << f.obtenerDia() << endl;
  
  // Especificación explícita de los valores de los parámetros
  int tm = 10;
  double *pd;
  pd = asignarMem<double>(tm);
  // asignarMem(&pd, tm);
  // ...
  delete pd;

  // Sobrecarga
  vector<double> v1(10);
  vector<double> v2(8);
  menor(10, 27);  // menor<int>(int, int)
  menor(v1, v2);  // menor<double>(vector<double>, vector<double>)
  menor(26.2, 26.8); // menor(double, double)
  
  // Especialización manual
  char *cad1 = "hola";
  char *cad2 = "adiós";
  char *cad3 = menor<char *>(cad1, cad2); // menor(char *, char *)
  cout << menor(cad1, cad2) << endl;      // menor(T *, T *)

  system("pause");
}

