Nueva función de C++ 17: declaraciones If Else y Switch con inicializadores

En muchos casos, necesitamos verificar el valor de algo devuelto por una función y realizar operaciones condicionales basadas en este valor. Así que nuestro código se parece a esto

// Some function
return_type foo(params)
  
// Call function with params and 
// store return in var
auto var = foo(params);
  
if (var == /* some value */) { 
   //Do Something
} else {
   //Do Something else
}

Si bien esto está bien, tenga en cuenta que hay algunas sutilezas

  • La variable se filtra al ámbito circundante, lo cual no está previsto y se debe tener cuidado para asegurarse de que esta variable no se mezcle con otras variables.
  • Dado que esta variable ya se ha definido, si tuviéramos que llamar a otra función (por ejemplo, bar()) más adelante en el programa, necesitaríamos crear otra variable para almacenar los valores devueltos por bar().
  • En tercer lugar, si el compilador puede saber explícitamente que la variable se utilizará solo en un bloque if-else, entonces puede optimizar mejor el código.

Observe el formato general en todos los bloques condicionales if-else. En primer lugar, hay una declaración inicial opcional que configura la variable, seguida del bloque if-else. Entonces, el bloque general if-else se parece a lo siguiente

init-statement

if (condition) {
    // Do Something
} else {
   // Do Something else 
}

En C++17, la instrucción init se denomina inicializador y podemos colocarla directamente en el bloque if-else de la siguiente manera

if (init-statement; condition) {
    // Do Something
} else {
    // Do Something else
}

El alcance de la variable condicionada se limita al bloque if-else actual. Esto también nos permite reutilizar el mismo identificador con nombre en otro bloque condicional.

if (auto var = foo(); condition) {
    ...
}
else{
    ...
}
  
// Another if-else block
if (auto var = bar(); condition) {
    ....
}
else {
    ....
}

Asimismo, se ha actualizado el bloque de la caja del interruptor. Ahora podemos poner una expresión inicial dentro del paréntesis de cambio. Después de la declaración inicial, necesitamos especificar qué variable se está utilizando para verificar los casos.

switch (initial-statement; variable) {
    ....
    // cases
}

un programa completo

// Program to demonstrate init if-else
// feature introduced in C++17
#include <iostream>
#include <cstdlib>
using namespace std;
  
int main() {
  
  // Set up rand function to be used
  // later in program
  srand(time(NULL));
  
  // Before C++17
  int i = 2;
  if ( i % 2 == 0)
    cout << i << " is even number" << endl;
  
  // After C++17
  // if(init-statement; condition)
  if (int i = 4; i % 2 == 0  )
    cout << i << " is even number" << endl;
  
  // Switch statement
  // switch(init;variable)
  switch (int i = rand() % 100; i) {
      default: 
         cout << "i = " << i << endl; break;
  }  
}

Salida (dependiente de la máquina)

2 is even number
4 is even number
i = 5

Nota: Para compilar estos programas necesitamos las últimas versiones de los compiladores. Al momento de escribir este artículo, esta función se ha implementado completamente en clang 5 y gcc 7 en adelante. Para compilar los programas también necesitamos especificar el indicador -std=c++17

g++-7 program_file.cpp -std=c++17

or

clang++ program_file.cpp -std=c++17

Publicación traducida automáticamente

Artículo escrito por Sayan Mahapatra y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *