Risposte:
Ha una sintassi simile, tranne per la rimozione dell'identificatore dal puntatore:
using FunctionPtr = void (*)();
Ecco un esempio
Se vuoi "togliere la bruttezza", prova ciò che Xeo ha suggerito:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
Ed ecco un'altra demo .
:(
using FunctionPtr = AddPointer<void()>;)
add_pointer<void()>::type: Utilizzando il suggerimento qui: groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… è possibile scrivere pointer<function<void>>.
La "bruttezza" può anche essere tolta se si evita di scrivere un puntatore:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*tardi e otterrò errori confusi.
Si desidera un type-id, che è sostanzialmente identico a una dichiarazione, tranne per il fatto che si elimina declarator-id. Di declarator-idsolito è un identificatore e il nome che si sta dichiarando nella dichiarazione equivalente.
Per esempio:
int x
Il declarator-idè xquindi basta rimuoverlo:
int
Allo stesso modo:
int x[10]
Rimuovi il x:
int[10]
Per il tuo esempio:
void (*FunctionPtr)()
Qui declarator-idè FunctionPtr. quindi rimuovilo per ottenere type-id:
void (*)()
Questo funziona perché, dato type-idche puoi sempre determinare in modo univoco dove andrebbe l'identificatore per creare una dichiarazione. Dall'8.1.1 nella norma:
È possibile identificare in modo univoco la posizione in [ID-tipo] in cui l'identificatore apparirebbe se la costruzione fosse una [dichiarazione]. Il tipo indicato è quindi uguale al tipo dell'ipotetico identificatore.
Che ne dici di questa sintassi per chiarezza? (Nota doppia parentesi)
void func();
using FunctionPtr = decltype((func));
Un altro approccio potrebbe utilizzare il tipo di ritorno automatico con tipo di ritorno finale.
using FunctionPtr = auto (*)(int*) -> void;
Questo ha il vantaggio discutibile di poter dire che qualcosa è una funzione ptr quando l'alias inizia con "auto (*)" e non è offuscato dai nomi degli identificatori.
Confrontare
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
con
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Disclaimer: ho preso questo dal discorso "Easing into Modern C ++" di Bean Deane
usingeffetti molto conf , soprattutto perché gli identificatori di puntatori a funzione di solito risiedevano nel mezzo ditypedefun'istruzione e si spostano in primo piano usandousing. Almeno è lì che mi sono perso.