una - tipos de funciones en c
¿Cómo se pasa una función como parámetro en C? (5)
Desde C ++ 11, puede utilizar la biblioteca funcional para hacer esto de manera sucinta y genérica. La sintaxis es, por ejemplo,
std::function<bool (int)>
donde bool
es el tipo de retorno aquí de una función de un argumento cuyo primer argumento es de tipo int
.
He incluido un programa de ejemplo a continuación:
// g++ test.cpp --std=c++11
#include <functional>
double Combiner(double a, double b, std::function<double (double,double)> func){
return func(a,b);
}
double Add(double a, double b){
return a+b;
}
double Mult(double a, double b){
return a*b;
}
int main(){
Combiner(12,13,Add);
Combiner(12,13,Mult);
}
A veces, sin embargo, es más conveniente usar una función de plantilla:
// g++ test.cpp --std=c++11
template<class T>
double Combiner(double a, double b, T func){
return func(a,b);
}
double Add(double a, double b){
return a+b;
}
double Mult(double a, double b){
return a*b;
}
int main(){
Combiner(12,13,Add);
Combiner(12,13,Mult);
}
Quiero crear una función que realice una función pasada por parámetro en un conjunto de datos. ¿Cómo se pasa una función como parámetro en C?
Esta pregunta ya tiene la respuesta para definir punteros de función, sin embargo, pueden ensuciarse mucho, especialmente si va a pasarlos por la aplicación. Para evitar este inconveniente, le recomiendo que escriba el puntero de función en algo más legible. Por ejemplo.
typedef void (*functiontype)();
Declara una función que devuelve vacío y no toma argumentos. Para crear un puntero de función para este tipo, ahora puede hacer:
void dosomething() { }
functiontype func = &dosomething;
func();
Para una función que devuelve un int y toma un char usted haría
typedef int (*functiontype2)(char);
y usarlo
int dosomethingwithchar(char a) { return 1; }
functiontype2 func2 = &dosomethingwithchar
int result = func2(''a'');
Hay bibliotecas que pueden ayudar a convertir los punteros de función en tipos de fácil lectura. La biblioteca de funciones boost es excelente y vale la pena el esfuerzo!
boost::function<int (char a)> functiontype2;
Es mucho mejor que lo anterior.
Necesitas pasar un puntero de función . La sintaxis es un poco incómoda, pero es realmente poderosa una vez que te familiarizas con ella.
Pase la dirección de una función como parámetro a otra función como se muestra a continuación
#include <stdio.h>
void print();
void execute(void());
int main()
{
execute(print); // sends address of print
return 0;
}
void print()
{
printf("Hello!");
}
void execute(void f()) // receive address of print
{
f();
}
También podemos pasar la función como parámetro usando la función de puntero.
#include <stdio.h>
void print();
void execute(void (*f)());
int main()
{
execute(&print); // sends address of print
return 0;
}
void print()
{
printf("Hello!");
}
void execute(void (*f)()) // receive address of print
{
f();
}
Declaración
Un prototipo para una función que toma un parámetro de función se parece a lo siguiente:
void func ( void (*f)(int) );
Esto indica que el parámetro f
será un puntero a una función que tiene un tipo de retorno void
y que toma un solo parámetro int
. La siguiente función ( print
) es un ejemplo de una función que podría pasarse a func
como parámetro porque es el tipo correcto:
void print ( int x ) {
printf("%d/n", x);
}
Llamada de función
Cuando se llama a una función con un parámetro de función, el valor pasado debe ser un puntero a una función. Use el nombre de la función (sin paréntesis) para esto:
func(print);
func
a func
, pasándole la función de impresión.
Cuerpo de funciones
Como con cualquier parámetro, func ahora puede usar el nombre del parámetro en el cuerpo de la función para acceder al valor del parámetro. Digamos que func aplicará la función que se pasa a los números 0-4. Considere, primero, cómo se vería el bucle para llamar a imprimir directamente:
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
print(ctr);
}
Como la declaración de parámetros de func
dice que f
es el nombre de un puntero a la función deseada, primero recordamos que si f
es un puntero, entonces *f
es la cosa a la que f
apunta (es decir, la función se print
en este caso). Como resultado, simplemente reemplace cada aparición de impresión en el bucle anterior con *f
:
void func ( void (*f)(int) ) {
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
(*f)(ctr);
}
}
De http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html