HOWTO · C++
Typedef para puntero de función en C++
Este artículo explica la palabra clave typedef y su uso en C++.
En esta página
Usa typedef en C++ para dar un nombre legible a un tipo de puntero a función. El alias acorta las declaraciones cuando guardas la dirección de una función, pasas una función como callback o eliges entre funciones con la misma firma. No crea un tipo distinto: hace referencia al tipo de puntero a función original. (puntero de función)
Cómo typedef da nombre a un tipo
typedef introduce un alias para un tipo que ya existe. Por ejemplo, typedef unsigned long Counter; permite usar Counter en declaraciones posteriores en lugar de unsigned long; no crea un tipo nuevo e incompatible. La misma regla se aplica cuando el tipo existente es un puntero a una función.
Esto resulta útil cuando una declaración es compleja o aparece en varios lugares. Un alias descriptivo facilita identificar una variable o un parámetro, mientras que el tipo subyacente sigue determinando qué valores son compatibles. Elige un nombre que describa la función, como una operación o un callback, en vez de repetir detalles que ya aparecen en la firma.
Cómo se declara un puntero a función
El tipo de un puntero a función incluye el tipo de retorno y los tipos de los parámetros de la función. En int (*operation)(int, int);, operation es un puntero a una función que acepta dos argumentos int y devuelve un int. Los paréntesis alrededor de *operation son importantes: indican que operation es un puntero a una función, y no una función que devuelve un puntero.
La función asignada a ese puntero debe tener un tipo de función compatible. En este ejemplo, es compatible una función que devuelve int y acepta dos parámetros int. No se puede asignar una función con un tipo de retorno o una lista de parámetros distintos como si tuviera el mismo tipo de callback. Mantén alineadas las declaraciones y las definiciones para que el compilador pueda comprobar la llamada de forma segura.
Crear y usar un alias de puntero a función con typedef
Coloca typedef antes del declarador del puntero a función y sustituye el nombre de la variable del puntero por el nombre del alias. Por ejemplo, typedef int (*BinaryOperation)(int, int); da al tipo de puntero el nombre BinaryOperation. Los paréntesis siguen formando parte del declarador, por lo que el alias describe un puntero a una función con una firma compatible.
Después, puedes declarar una variable con BinaryOperation operation;, asignarle una función compatible y llamarla a través del puntero. También es válido tomar explícitamente la dirección de una función con &; en este contexto, el nombre de la función también se convierte en su dirección. El alias corresponde al tipo de puntero, así que declarar operation crea una variable puntero, no un objeto función.
Compilar y llamar a través del alias
Este ejemplo completo define una función compatible, guarda su dirección en una variable declarada con el alias y la llama con dos argumentos enteros. La llamada operation(6, 7) equivale a llamar mediante (*operation)(6, 7); ambas invocan la función a la que apunta el puntero en ese momento.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
#include <iostream>
typedef int (*BinaryOperation)(int, int);
int multiply(int left, int right) {
return left * right;
}
int main() {
BinaryOperation operation = &multiply;
std::cout << "Product: " << operation(6, 7) << '\n';
return 0;
}
Product: 42
En la ejecución suministrada, esta llamada imprime Product: 42. El resultado se obtiene al llamar a multiply(6, 7) a través de operation: multiply devuelve 42 y std::cout escribe ese valor después de Product: . La etiqueta Product: del ejemplo permanece en inglés porque el bloque de salida se conserva sin cambios. Al adaptar el ejemplo, mantén los tipos de retorno y de parámetros del alias compatibles con los de la función de destino. Puedes asignar otra función compatible a la misma variable BinaryOperation y llamarla con la misma sintaxis.