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-id
solito è un identificatore e il nome che si sta dichiarando nella dichiarazione equivalente.
Per esempio:
int x
Il declarator-id
è x
quindi 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-id
che 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
using
effetti molto conf , soprattutto perché gli identificatori di puntatori a funzione di solito risiedevano nel mezzo ditypedef
un'istruzione e si spostano in primo piano usandousing
. Almeno è lì che mi sono perso.