Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





subrangos c++ y std::out_of_range

Iniciado por Vandalism, 11 de Marzo de 2008, 02:58:52 PM

« anterior - próximo »

Vandalism

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

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

ZüNdFoLGe


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();
  }

davur

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.).

[EX3]

Que quieres que te diga, para una simple comprobacion de rango a mi me parece matar moscas a cañonazos, pero weno :D

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

davur

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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.