usar tipos sirven que punteros puntero para los funciones estructura dev declaracion datos con como cadenas apuntadores c++ types function-pointers

c++ - tipos - punteros a cadenas



¿Puede alguien explicarme un tipo de puntero de función complicado en C++? (3)

¿Alguien puede decirme cuál es el tipo de parámetro para la función f ?

int f(void (*(int,long))(int,long)) {}

Obtengo un tipo similar a este cuando intento compilar algunos códigos pesados ​​de plantillas variad (mi propio envoltorio alrededor de std::thread ) ...


En la declaracion de funcion

int f(void (*(int,long))(int,long));

Se utiliza la forma ofuscada de puntero de función. Comencemos con lo básico para entender este código.

void (*f_ptr)(long);

declara f_ptr como un puntero a una función que espera un parámetro long y no devuelve nada.

Como parámetro de una función, este puntero de función se puede declarar como

int f1( void f_ptr(int) ); int f2( void (*f_ptr)(int) );

Tanto void f_ptr(int) como void (*f_ptr)(int) son idénticos como parámetro de función. Ahora cambiando el tipo de retorno de f_ptr a puntero a void ( void * )

int f1( void *f_ptr(int) ); // f_ptr is a function pointer that expects an int type and // returns a pointer to void int f2( void *(*f_ptr)(int) );

El nombre de un parámetro de función se puede eliminar y, por lo tanto, las declaraciones anteriores se convertirán en

int f1( void *(int) ); int f2( void *(*)(int) );

Ahora puedes desenfocar tu declaración de función original

int f( void ( *(int, long) ) (int, long) );

como

int f( void ( *(*)(int, long) ) (int, long) );

y puedes colocar un nombre para puntero de función

int f( void ( *(*func_ptr)(int, long) ) (int, long) );

Por lo tanto, func_ptr es un puntero a una función que espera un parámetro de tipo int y un tipo long y devuelve un puntero a una función que espera un parámetro de tipo int y un largo y devuelve void .


Es una función que lleva un puntero a una función que toma int y long como parámetros y devuelve una función que toma int y long como parámetros y devuelve void . Probablemente sea mucho más claro si utiliza un tipo de retorno final y nombra la función:

int f(auto g(int, long) -> void (*)(int, long));


La declaracion

int f(void (*(int,long))(int,long)) {}

declara que una función f devuelve int y toma como argumento un puntero a una función que toma int, long parámetros int, long y devuelve un puntero a una función que devuelve void y toma parámetros int, long . Usando typedef para el puntero de función más interno, esto se vuelve más legible:

typedef void (*fptr)(int, long); int f(fptr(int, long));

O con un parámetro nombrado,

int f(fptr handler(int, long));

Este es un código perfectamente válido, pero es extraño verlo en la salida del compilador porque usa una regla de sintaxis especial: en una lista de parámetros de función, un declarador de tipo de función declara un parámetro de puntero de función. Es decir,

int f(fptr handler (int, long)); // is equivalent to int f(fptr (*handler)(int, long));

... y esperaría que el compilador usara la forma general, inferior.