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.