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ó.
- Absolutamente odio mi trabajo como ingeniero de software, pero paga muy bien. ¿Debo renunciar y perseguir mi pasión de ser contador?
- ¿Alguien no le gustó la programación al principio pero luego le gustó después de un tiempo?
- ¿Cómo es trabajar como ingeniero en Mozilla?
- ¿Cuáles son los tipos de desafíos que enfrenta como desarrollador sénior?
- ¿Cómo es ser ingeniero de software en Tumblr?
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); }