Enviado por Llyn 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
- Intento de grep en c++ Buenas. Necesitaba este pequeño programita para algo que estoy haciendo,...
- Balanceo de expresiones usando pilas en c++ Buenas El balanceo de expresiones (no se con que otro...
- ¿Cómo iterar en sentido contrario? Respuesta: reverse_iterator Lo puedes conseguir en la librería STL, bajo...
- Iterando en el dominio de una función Bien, volvemos a la programación, bueno casi. Tenemos este problema,...
- Balanceo de expresiones II Buenas. Ayer en este post hablabamos de balanceo de expresiones...
- Sobre punteros, memoria dinámica y otras hierbas alucinogenas. “La gestión manual de bloques de memoria en C es...



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
UsandoPara 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?
Usandojejeje calmate “para entendidos” solo tienes envidia
Usando