Ver Mensaje Individual
  #3 (permalink)  
Antiguo 29/04/2015, 01:27
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 3 meses
Puntos: 204
Respuesta: ¿Funciones en tiempo de ejecucion?

Tu pregunta no está bien planteada.

¿Te refieres a crear código en tiempo de ejecución?

Lamentablemente el estándar de C++ no permite esto. Es posible que alguna extensión de Clang o similar te pueda permitir este tipo de compilación, pero yo todavía no me he encontrado con una sola situación en la que necesite hacer esto en C++. Para sacarle partido a esta funcionalidad, C++ debería tener características que ahora mismo ni se las espera.

¿Te refieres a cómo usar los condicionales?

En el caso de usar una cadena de ifs quedaría así:

Código C++:
Ver original
  1. int valor;
  2. std::cin >> valor;
  3. if( valor == 0 )
  4.   func0( );
  5. else if( valor == 1 )
  6.   func1( );
  7. else if( valor == 2 )
  8. // ...

Claro que también podría ser recomendable usar un switch:

Código C++:
Ver original
  1. int valor;
  2. std::cin >> valor;
  3. switch( valor )
  4. {
  5.   case 0:
  6.     func0( );
  7.     break;
  8.  
  9.   case 1:
  10.     func1( );
  11.     break;
  12.  
  13.   case 2:
  14.    func2( );
  15.    break;
  16.  
  17.   // ...
  18. }

¿Te refieres a hacer algo parecido a lo anterior pero sin condicionales?

Bueno, en este caso tienes, como no podía ser de otra forma, varias opciones a elegir:

  1. Punteros a función
    Código C++:
    Ver original
    1. #include <iostream>
    2. #include <map>
    3.  
    4. void func0( )
    5. {
    6.   std::cout << "opcion incorrecta" << std::endl;
    7. }
    8.  
    9. void func1( )
    10. {
    11.   std::cout << "func1" << std::endl;
    12. }
    13.  
    14. void func2( )
    15. {
    16.   std::cout << "func2" << std::endl;
    17. }
    18.  
    19. void func3( )
    20. {
    21.   std::cout << "func3" << std::endl;
    22. }
    23.  
    24. typedef void (*ptrAFuncion)();
    25.  
    26. int main( )
    27. {
    28.   std::map< int, ptrAFuncion > mapa;
    29.   mapa[ 0 ] = &func0;
    30.   mapa[ 1 ] = &func1;
    31.   mapa[ 2 ] = &func1;
    32.   mapa[ 3 ] = &func1;
    33.  
    34.   std::cout << "Introduce una opcion: " << std::endl;
    35.   unsigned int opcion;
    36.   std::cin >> opcion;
    37.  
    38.   if( opcion >= mapa.size( ) )
    39.     opcion = 0;
    40.  
    41.   mapa[ opcion ]( ); // Llamamos a la función
    42. }
  2. Usando std::function
    Código C++:
    Ver original
    1. int main( )
    2. {
    3.   std::map< int, std::function< void(void) > > mapa;
    4.   mapa[ 0 ] = &func0;
    5.   mapa[ 1 ] = &func1;
    6.   mapa[ 2 ] = &func2;
    7.   mapa[ 3 ] = &func3;
    8.  
    9.   std::cout << "Introduce una opcion: " << std::endl;
    10.   unsigned int opcion;
    11.   std::cin >> opcion;
    12.  
    13.   if( opcion >= mapa.size( ) )
    14.     opcion = 0;
    15.  
    16.   mapa[ opcion ]( ); // Llamamos a la función
    17. }

Un saludo