Respuestas:
Tiene una sintaxis similar, excepto que elimina el identificador del puntero:
using FunctionPtr = void (*)();
Aquí hay un ejemplo
Si quieres "quitar la fealdad", prueba lo que sugirió Xeo:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
Y aquí hay otra demostración .
:(
using FunctionPtr = AddPointer<void()>;)
add_pointer<void()>::type: Usando la sugerencia aquí: groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… puede escribir pointer<function<void>>.
La "fealdad" también se puede eliminar si evita escribir un puntero:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*más tarde y obtener errores confusos.
Desea un type-id, que es esencialmente exactamente lo mismo que una declaración, excepto que elimina el declarator-id. Por declarator-idlo general, es un identificador y el nombre que está declarando en la declaración equivalente.
Por ejemplo:
int x
El declarator-ides xtan solo quítelo:
int
Igualmente:
int x[10]
Eliminar el x:
int[10]
Por su ejemplo:
void (*FunctionPtr)()
Aquí declarator-idestá el FunctionPtr. así que simplemente quítelo para obtener el type-id:
void (*)()
Esto funciona porque type-idsiempre se puede determinar de forma exclusiva dónde iría el identificador para crear una declaración. De 8.1.1 en el estándar:
Es posible identificar de forma exclusiva la ubicación en [id-tipo] donde aparecería el identificador si la construcción fuera una [declaración]. El tipo nombrado es el mismo que el tipo del identificador hipotético.
¿Qué tal esta sintaxis para mayor claridad? (Nota paréntesis doble)
void func();
using FunctionPtr = decltype((func));
Otro enfoque podría usar el tipo de retorno automático con el tipo de retorno final.
using FunctionPtr = auto (*)(int*) -> void;
Esto tiene la ventaja discutible de poder decir que algo es una función ptr cuando el alias comienza con "auto (*)" y no está ofuscado por los nombres de los identificadores.
Comparar
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
con
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Descargo de responsabilidad: Tomé esto de la charla de Bean Deane "Easing into Modern C ++"
using, de hecho, especialmente porque los identificadores de puntero de función generalmente residen en el medio de unatypedefdeclaración y se mueven al frente usandousing. Al menos ahí es donde estoy perdido.