Tengo la situación en la que una función llama a una de varias funciones posibles. Este parece ser un buen lugar para pasar una función como parámetro. En esta respuesta de Quoara de Zubkov hay tres formas de hacer esto.
int g(int x(int)) { return x(1); }
int g(int (*x)(int)) { return x(1); }
int g(int (&x)(int)) { return x(1); }
...
int f(int n) { return n*2; }
g(f); // all three g's above work the same
¿Cuándo se debe utilizar qué método? ¿Qué hay diferencias? Prefiero el enfoque más simple, ¿por qué no debería usarse siempre la primera forma?
Para mi situación, la función solo se llama una vez y me gustaría que sea simple. Lo tengo trabajando con pasar por puntero y simplemente lo llamo con g(myFunc)
dónde myFunc
está la función que se llama al último.
c++
function
parameter-passing
norteño
fuente
fuente
g(+f);
funciona para los dos primeros, pero no para el tercero.int g(int x(int))
,x
es un puntero a pesar de que no se parece a uno. La declaración global correspondienteint x(int);
declara una función, no un puntero de función.x
como puntero.Respuestas:
Ampliando el comentario de LF, a menudo es mejor evitar por completo los punteros de función y trabajar en términos de objetos invocables (cosas que definen
operator()
). Todo lo siguiente le permite hacer eso:Es importante destacar que todos estos pueden usarse en funciones lambda con capturas, a diferencia de cualquiera de sus opciones:
fuente
<algorithm>
utilizan este enfoque para aceptar funciones de devolución de llamada.g<int>(myFunc)
solog(myFunc)
?