En C/C++ tengo un escenario en el que debería ejecutarse sobre la base del tamaño vacío. Si el tamaño de la variable a es 0, entonces se debe imprimir la cadena 'agregar nombre'; de lo contrario, se debe imprimir la cadena 'déjalo'. Pero también tengo casos de cambio para la codificación, para cada caso habrá una condición diferente.
switch(encoding) case utf: if(a->size-5 == 0) { cout<<"add name"; } else { cout<<"leave it"; } case ansi: if(a->size-4 == 0) { cout<<"add name"; } else { cout<<"leave it"; } case ansi8: if(a->size-8 == 0) { cout<<"add name"; } else { cout<<"leave it"; }Quiero hacerlo de forma mínima. Entonces, ¿cuál es la mejor manera de hacer eso?
No entiendo completamente qué solución espera, pero, al igual que se sugiere en un comentario, al eliminar la duplicación de su código, nos queda:
if(a->size-offset == 0) { cout<<"add name"; } else { cout<<"leave it"; } Donde la offset se puede determinar a través de:
int offset = 0; switch(encoding) { case utf: offset = 5; break; case ansi: offset = 4; break; case asni8: offset = 8; break; }Probablemente, una solución más limpia sería usar un tipo polimórfico de modo que las diferencias en la codificación se encapsulen en métodos virtuales, y puede escribir:
if(a->check_size()) { cout<<"add name"; } else { cout<<"leave it"; }Creo que el operador ternario es el mejor enfoque.
switch(encoding) { case utf: (a->size - 5 == 0) ? std::cout << "add name" : std::cout << "leave it"; break; case ansi: (a->size - 4 == 0) ? std::cout << "add name" : std::cout << "leave it"; break; case ansi8: (a->size - 8 == 0) ? std::cout << "add name" : std::cout << "leave it"; break; }Escribiría tu código así:
//... //assuming utf, ansi, and ansi8 are enumerated constants static const int encoding2size[]={ [utf]=5,[ansi]=4,[ansi8]=8 }; //... if(a->size - encoding2size[encoding] == 0) cout<<"add name"; else cout<<"leave it"; //...