Foros del Web » Programación para mayores de 30 ;) » C/C++ »

¿Funciones en tiempo de ejecucion?

Estas en el tema de ¿Funciones en tiempo de ejecucion? en el foro de C/C++ en Foros del Web. Saludos a todos, me gustaria saber si hay alguna forma en c++ de construir funciones en tiempo de ejecucion segun un parametro que nos dé ...
  #1 (permalink)  
Antiguo 28/04/2015, 10:05
 
Fecha de Ingreso: abril-2015
Mensajes: 1
Antigüedad: 9 años
Puntos: 0
¿Funciones en tiempo de ejecucion?

Saludos a todos, me gustaria saber si hay alguna forma en c++ de construir funciones en tiempo de ejecucion segun un parametro que nos dé el usuario, es decir, que si pone un 1 construya una funcion, pero si pone un 50 construya otra. Muchas gracias
  #2 (permalink)  
Antiguo 28/04/2015, 13:19
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 10 meses
Puntos: 28
Respuesta: ¿Funciones en tiempo de ejecucion?

¿En tiempo de ejecución? Pasandole un array de punteros void* .

Pero no me parece ni el método más sencillo, ni el más eficiente ni el más seguro de hacer algo. Piensalo mejor.
  #3 (permalink)  
Antiguo 29/04/2015, 01:27
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 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
  #4 (permalink)  
Antiguo 29/04/2015, 05:59
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 10 meses
Puntos: 28
Respuesta: ¿Funciones en tiempo de ejecucion?

Mejor que un mapa, sería un vector no?

Vector accede directamente, mientras que el map tiene que buscar la posición...
  #5 (permalink)  
Antiguo 29/04/2015, 06:38
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: ¿Funciones en tiempo de ejecucion?

Cita:
Iniciado por amchacon Ver Mensaje
Mejor que un mapa, sería un vector no?

Vector accede directamente, mientras que el map tiene que buscar la posición...
Bueno, el mapa te permite usar un string por índice si fuese necesario.

Sin embargo, lo de usar el mapa ha sido porque me parecía que el ejemplo quedaba más claro.

Etiquetas: funcion, tiempo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:36.