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-id
lo general, es un identificador y el nombre que está declarando en la declaración equivalente.
Por ejemplo:
int x
El declarator-id
es x
tan solo quítelo:
int
Igualmente:
int x[10]
Eliminar el x
:
int[10]
Por su ejemplo:
void (*FunctionPtr)()
Aquí declarator-id
está el FunctionPtr
. así que simplemente quítelo para obtener el type-id
:
void (*)()
Esto funciona porque type-id
siempre 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 unatypedef
declaración y se mueven al frente usandousing
. Al menos ahí es donde estoy perdido.