feb 16, 2010

Enviado por en C/C++, Programacion

It’s time to choose

Digamos esto, dado un valor quieres hacer algo. Ejemplo,

enum {
	John, Paul, Ringo, George
} quien_fue = Paul;

switch (quien_fue) {
	case John: cout << "Fue John." << endl; break;
	case Paul: cout << "Fue Paul." << endl; break;
	case Ringo: cout << "Fue Ringo." << endl; break;
	case George: cout << "Fue George." << endl; break;
};


Ahora queremos complicarnos la vida con una extraña sintaxis, que tal esta:

cout << choose<string>(quien_fue)
	(John, "Fue John.")
	(Paul, "Fue Paul.")
	(Ringo, "Fue Ringo.")
	(George, "Fue George.")
	() << endl;

No solo eso, si odias los punteros ¡puedes seleccionar una referencia!,

int mesada_de_John = 150, mesada_de_Paul = 150,
	mesada_de_Ringo = 100, mesada_de_George = 100;

int & mesada = choose_reference<int>(quien_fue)
	(John, mesada_de_John)
	(Paul, mesada_de_Paul)
	(Ringo, mesada_de_Ringo)
	(George, mesada_de_George)
	();

mesada -= 50; /* lo siento Paul */

¿Y qué tal si no se encuentra entre las opciones? Bueno, nos lanza una linda excepción undefined_value. Para evitarlo puedes usar whatever,

cout << "El sexo es " << choose<string>(sexo)
	(Masculino, "masculino.")
	(Femenino, "femenino.")
	(whatever, "indefinido.")
	() << endl;

Pero preferimos ver nuestro programa caer ¿verdad? Es más vamos a adentrarnos en la librería STL y en <functional> encontraremos rarezas como bind1st. Vamos a probar,

bool es_cero, menor_que_3, mayor_que_3, es_3;

bool & p = choose_reference<bool>(3)
	(logical_not<int>(), es_cero)
	(bind2nd(less<int>(), 3), menor_que_3)
	(bind2nd(greater<int>(), 3), mayor_que_3)
	(whatever, es_3)
	();

p /* es_3 */ = true;

¿Qué tal funciones lambda?

bool & q = choose_reference<bool>(-100)
	([](int x) { return x < 3; }, menor_que_3)
	(whatever, mayor_o_igual_que_3)
	();

q /* menor_que_3 */ = true;

Todo esto exclusivamente para el viejo y complicado C++, y para mejorar las cosas tienes que tener soporte para TR1 (lástima que existe Boost). ¿Quieres intentar? Entonces haz clic aquí.

    Posts Relacionados

    1. como siempre METAbien (solo para entendidos), si lastima con lo lindo que es hacer todo artesanal y a pie ^^ (sobre todo si eres masoca), estuve mirando functional tiene cosas bastante peculiares asi por encima me parecio por demas curioso mem_fun no se que tan util pueda llegar a ser pero curioso evidentemente es

      Usando Firefox 3.6 Firefox 3.6 en Windows Vista Windows Vista
    2. Para entendidos y Geek, O.o tube problemas para dormir luego que vi estos codigos… jajajaj me aparecian en los sueños.

      Te felicito buen post…

      PD: Casper donde estas?

      Usando Firefox 3.5.8 Firefox 3.5.8 en Windows 7 Windows 7

    Dejar una respuesta

    Debes ser Alojarse para enviar un comentario.