Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Vandalism en 11 de Marzo de 2008, 02:58:52 PM

Título: subrangos c++ y std::out_of_range
Publicado por: Vandalism en 11 de Marzo de 2008, 02:58:52 PM
Quiero restringir la entrada de un numero de 1 a 10, usando un try catch por si el usuario ingresa un numero fuera de rango que me tire la excepcion out_of_range. Como defino el subrango de int de 1 a 10 en la clase??? gracias de antemano
Título: subrangos c++ y std::out_of_range
Publicado por: [EX3] en 11 de Marzo de 2008, 03:34:32 PM
Yo no usaria un try/catch para evaluar un rango, un simple if te bastaria:
If (value < 1 || value > 10) { throw new out_of_range(); }
Salu2...
Título: subrangos c++ y std::out_of_range
Publicado por: ZüNdFoLGe en 11 de Marzo de 2008, 09:18:45 PM

try {
       if (num < 1 || num > 10)
           throw std::out_of_range("Ingresa numeros correctos..JODER!!!");
           // codigo
           ...
   }
  catch ( std::out_of_range oor) {
     std::cout << oor.what();
  }
Título: subrangos c++ y std::out_of_range
Publicado por: davur en 11 de Marzo de 2008, 11:55:05 PM
También es posible incorporar la lógica de la comprobación del rango dentro del propio tipo numérico. A modo de ejemplo (y como tal muy simple, limitado y abierto a multitud de adiciones y modificaciones):

#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>

template <int min, int max>
struct ThrowOnOutOfRange
{
static int check_value(int new_value)
{
if (new_value < min || new_value > max)
{
std::ostringstream oss;
oss << "Value " << new_value << " out of range [" << min << ", " << max << "]!";

std::string error_msg(oss.str());

throw std::out_of_range(error_msg.c_str());
}

return new_value;
}
};

template <int min, int max,
class ErrorPolicy = ThrowOnOutOfRange<min, max> >
class checked_int
{
public:
explicit checked_int(int i = min)
: value_(ErrorPolicy::check_value(i)) {}

// todas las funciones miembro necesarias...

private:
int value_;
};

int main()
{
try
{
checked_int<1, 10> n(15);
}
catch (const std::out_of_range& e)
{
std::cout << e.what() << std::endl;
}

return 0;
}


Es interesante notar que se puede definir toda una batería de políticas de actuación en caso de intentar asignar un valor fuera del rango estipulado (lanzar una excepción, modular el valor, etc.).
Título: subrangos c++ y std::out_of_range
Publicado por: [EX3] en 12 de Marzo de 2008, 09:52:14 AM
Que quieres que te diga, para una simple comprobacion de rango a mi me parece matar moscas a cañonazos, pero weno :D

Salu2...
Título: subrangos c++ y std::out_of_range
Publicado por: davur en 12 de Marzo de 2008, 08:02:15 PM
De hecho, para _una simple_ comprobación de rango es matar moscas a cañonazos. Pero, en ocasiones, en el mundo real las cosas no son tan simples.