// leerdatos.h - Funciones para leer datos de forma segura
#if !defined( _LEERDATOS_H_ )
#define _LEERDATOS_H_

#include <iostream>
#include <limits>
#include <string>

template<class T> bool leerDato(T& dato)
{
  std::cin.exceptions(std::ios::failbit | std::ios::badbit);
  try
  {
    std::cin >> dato;
    // Eliminar caracteres sobrantes. Por ejemplo <Entrar>.
    std::cin.ignore(std::numeric_limits<int>::max(), '\n');
    return true;
  }
  catch(std::ios_base::failure& e)
  {
    if (std::cin.eof())
    {
      std::cin.clear();
      return false; // se pulsó Ctrl+Z
    }
    else
    {
      std::cout << e.what() << ": dato no válido\n";
      std::cin.clear();
      std::cin.ignore(std::numeric_limits<int>::max(), '\n');
      return leerDato(dato);
    }
  }
}

bool leerDato(std::string& dato);

int menu(char *opciones[], int numOpciones);

#endif // _LEERDATOS_H_
