Estoy tratando de hacer una función que toma un carácter, luego devuelve un puntero a una función dependiendo de lo que el personaje era. Simplemente no estoy seguro de cómo hacer que una función devuelva un puntero a una función.¿Cómo hacer que una función devuelva un puntero a una función? (C++)
Respuesta
#include <iostream>
using namespace std;
int f1() {
return 1;
}
int f2() {
return 2;
}
typedef int (*fptr)();
fptr f(char c) {
if (c == '1') {
return f1;
}
else {
return f2;
}
}
int main() {
char c = '1';
fptr fp = f(c);
cout << fp() << endl;
}
Muy buen ejemplo – Baget
Me pregunto por qué funciona esto. ¿No deberíamos deferencia el puntero a la función primero, es decir 'cout << (* fp)() << endl;'? – qed
@qed: No. Puedes desreferenciarlo, pero está perfectamente bien no hacerlo. La función usual ya es un puntero interno de todos modos. – xryl669
Este es el código para mostrar el retorno de un puntero a la función. Es necesario definir la "firma de la función" para volver primero:
int returnsOne() {
return 1;
}
typedef int(*fp)();
fp returnsFPtoReturnsOne() {
&returnsOne;
}
En su caso específico:
fp getFunctionFor(char code) {
switch (code) {
case 'a': return &functionA;
case 'b': return &functionB;
}
return NULL;
}
Mi voto negativo es porque quiere devolver el puntero a la función, no emitir a void * y devolverlo. – CiscoIPPhone
sí, mi primera respuesta fue rápida y sucia, lo arreglé ... comiendo cuervo ahora. –
Crear un typedef para la firma de la función:
typedef void (* FuncSig)(int param);
Entonces declaran su funcionar como FuncSig de retorno:
FuncSig GetFunction();
Estoy asumiendo C (aquí no hay objetos) :):
// Type of function which takes a char and returns an int:
typedef int (*Func)(char a);
// An example of the function you're trying to return and which does something
// with char:
int exampleFunc(char a)
{
return (int)(a + 42);
}
// The function returning the pointer to a function:
Func *returnAfunc(void)
{
return exampleFunc;
}
typedef void (*voidFn)();
void foo()
{
}
voidFn goo(char c)
{
if (c == 'f') {
return foo;
}
else {
//..
}
// ..
}
forma más fácil es el tipo typedef-puntero a la función que desee y, a continuación, utilizar ese
typedef void (*fnptr_t)(int, int);
fptr_t myfunc(char *) { ....
Prefiero devolver objetos y llamar al operador(). De esta forma, su función puede devolver una interfaz y todas las clases pueden heredar de esto. Es decir, si usa C++ y no C.
Luego puede usar el método del factor parametrizado para devolver los objetos según su entrada.
Algo como esto
#include <iostream>
typedef char (*fn_ptr_t)(char);
char a_fn(char c)
{
return c + 1;
}
char b_fn(char c)
{
return c + 2;
}
fn_ptr_t
return_function(char c)
{
fn_ptr_t result = 0;
switch (c)
{
case 'a':
result = a_fn;
break;
case 'b':
result = b_fn;
break;
}
return result;
}
int
main()
{
fn_ptr_t fn = return_function('a');
std::cout << "a(l) = " << (fn)('l') << std::endl;
return 0;
}
int f(char) {
return 0;
}
int (*return_f())(char) {
return f;
}
No, en serio, utilizar un typedef :)
+1 para mostrar cómo se ve la sintaxis sin typedef. –
Buena respuesta, esto muestra la complejidad del lenguaje. – iammilind
@Axalo El programa se compila como está. '' 'return_f''' no toma ningún argumento sino que devuelve una función que toma una char. – erikkallen
Salida este sitio - http://cdecl.org
le ayuda a convertir Inglés de declaraciones de C y de vuelta!
Cool Stuff!
Este enlace decodifica el ejemplo en la respuesta de erikallen. int (*return_f())(char)
Aquí es cómo hacerlo sin necesidad de utilizar un typedef:
int c(){ return 0; }
int (* foo (void))(){ //compiles
return c;
}
Sintaxis para el retorno de la función:
return_type_of_returning_function (*function_name_which_returns_function)(actual_function_parameters) (returning_function_parameters)
Ej: en cuenta la función que tienen que ser devueltos como sigue,
void* (iNeedToBeReturend)(double iNeedToBeReturend_par)
{
}
Ahora la función iNeedToBeReturend puede ser devuelto como
void* (*iAmGoingToReturn(int iAmGoingToReturn_par))(double)
{
return iNeedToBeReturend;
}
me sentí muy mal para aprender este concepto después de 3 años de vida profesional de programación.
Bonificación para que espere a que aparezca el puntero de la función de desreferenciación.
Ejemplo para la función que devuelve el puntero de función es dlopen in dynamic library in c++
En C++ 11 puede utilizar arrastra tipos de retorno para simplificar la sintaxis, por ejemplo asumiendo una función:
int c(int d) { return d * 2; }
Esto puede ser devuelto de una función (que lleva una doble para demostrar que):
int (*foo(double e))(int)
{
e;
return c;
}
El uso de un tipo de retorno de arrastre, esto se convierte en un poco más fácil de leer:
auto foo2(double e) -> int(*)(int)
{
e;
return c;
}
- 1. Sintaxis para un puntero a una función que devuelve un puntero de función en C
- 2. Puntero de función que apunta a una función que toma un puntero de función
- 3. ¿Cómo paso un puntero a una función c en Cython?
- 4. ¿Cómo declaras un puntero a una función que devuelve un puntero a una matriz de valores int en C/C++?
- 5. C: ¿Cómo pasar un doble puntero a una función
- 6. Crear una función de Oracle que devuelva una tabla
- 7. ¿Se puede llamar a una función estática a través de un puntero de función en C?
- 8. Crear un puntero a la función que toma un puntero a la función como argumento
- 9. Pasar la función puntero a miembro como puntero a función
- 10. ¿Cómo pasar una matriz constante literal a una función que toma un puntero sin usar una variable C/C++?
- 11. Inicializando un puntero en una función separada en C
- 12. Llamar a una función con un puntero no const se restituye a una función de plantilla sobre una función tomando un puntero a const
- 13. ¿Cómo modifico un puntero que se ha pasado a una función en C?
- 14. Para pasar un puntero a una función miembro
- 15. ¿Cómo pasar un puntero a una función con argumentos variables?
- 16. En Lua, ¿hay alguna función que, dada una función, devuelva su nombre como una cadena?
- 17. Puntero de función C#?
- 18. C# función de puntero en función sobrecargada
- 19. ¿Cómo hash y compara una función de puntero a miembro?
- 20. Pasar un puntero a una función de ensamblaje
- 21. Dado un puntero al miembro a dentro de una estructura, escriba una rutina que devuelva un puntero a la estructura
- 22. Puntero de función como miembro de una estructura C
- 23. ¿GCC alineará una función que toma un puntero?
- 24. C: puntero a función en línea
- 25. Llamar a una función virtual estáticamente a través de un puntero a la función
- 26. Pasando un puntero a putchar a una función que recibe un int (*) (int)
- 27. Un puntero a una función encuadernada solo se puede usar para llamar a la función
- 28. En C++ puede tener un puntero a una función, ¿También puede tener un puntero a una clase?
- 29. Puntero de función a función de miembro
- 30. ¿Hay una función estándar en C que devuelva la longitud de una matriz?
¿La firma de la función devuelta será siempre la misma? –
Aquí está la firma de una función que toma un puntero de función y devuelve uno: http://en.cppreference.com/w/c/program/signal –