Ingeniería de software: ¿Cómo generar una función C ++ mediante programación?

Es difícil entender a qué te refieres. Pero por lo que está diciendo sobre “generar” una función, lo que está buscando son cierres .

Dijiste que querías “generar” la función f, donde f usa una variable p que no es un parámetro para la función, pero está “fija” para f. Si puede hacer algo como lo siguiente (pseudocódigo), ¿se adaptaría a sus necesidades?

  make_f (vector  p) {
     función de retorno f (vector  x) {
         retorno x punto p;
     };
 } 

Aquí la función interna tiene acceso a “p” desde el exterior. Además, la función interna se devuelve desde la función externa, lo que significa que tiene acceso a “p” incluso después de que el alcance de la función externa ya no exista. Esto es lo que es un cierre: una función interna que puede referirse a variables locales externas que existen en el momento en que se creó.

Tenga en cuenta que aquí no hay código de “compilación” en tiempo de ejecución; más bien, el código se especifica en tiempo de compilación, pero el compilador lo hace de alguna manera para que la función interna “recuerde” p incluso después de que el alcance de la variable local p ya no exista.

La mayoría de los idiomas (especialmente de nivel superior) tienen cierres. Sin embargo, C / C ++ no ha tenido funciones internas, hasta que C ++ 11 introdujo lambdas. Un lambda C ++ 11 es un cierre y hace exactamente lo que describimos anteriormente. Con C ++ 11 lambdas, lo anterior se escribiría algo así como:

  std :: function <vector  (vector )>
   make_f (vector  p) {
     return [p] (vector  x) {
         retorno x punto p;
     };
 } 

Tenga en cuenta que para que esto funcione, su función RungeKutta no tomaría un puntero de función; más bien, necesita tomar un tipo más generalizado que pueda funcionar con otros tipos invocables. El tipo de parámetro podría ser std::function , o podría tener la plantilla para tomar cualquier tipo invocable.

C ++ 11 lambdas son solo azúcar sintáctico para un tipo de objeto de función. Entonces, incluso si no tuviera C ++ 11, aún podría implementar lo anterior de la siguiente manera. Así es como se implementan los cierres debajo de todos modos.

  clase my_func {
     vector  p;
 público:
     my_func (vector  _p): p (_p) {}
     vector  operator () (vector  x) {
         retorno x punto p;
     }
 };

 my_func make_f (vector  p) {
     devuelve my_func (p);
 } 

Si conoce la longitud de los vectores involucrados en el momento de la compilación, puede usar la metaprogramación de plantilla para desenrollar el bucle involucrado en el producto punto.

Puede generar código (C o ensamblaje o cualquier otra cosa), compilarlo y vincularlo dinámicamente.

Ejemplo simple:

Ejemplo complejo:

O use LLVM o GNU Lightning, pero encontré estos dos más complejos.

C ++ 11 – Lambda Closures, la guía definitiva – Cprogramming.com
(no es la única opción, y no necesariamente la mejor opción, pero vale la pena considerarla)