J’aimerais écrire ceci
typedef void (*FunctionPtr)();
utiliser en using
. Comment pourrais-je faire ça?
Sa syntaxe est similaire, sauf que vous supprimez l’identifiant du pointeur:
using FunctionPtr = void (*)();
Voici un exemple
Si vous voulez “enlever la moche”, essayez ce que Xeo a suggéré:
#include using FunctionPtr = std::add_pointer::type;
Et voici une autre démo .
La “laideur” peut également être enlevée si vous évitez de taper un pointeur:
void f() {} using Function_t = void(); Function_t* ptr = f; ptr();
Vous voulez un type-id
, qui est essentiellement identique à une déclaration, sauf que vous supprimez l’ declarator-id
du declarator-id
. L’ declarator-id
est généralement un identifiant et le nom que vous déclarez dans la déclaration d’équivalence.
Par exemple:
int x
L’ declarator-id
est x
alors supprimez-le simplement:
int
Également:
int x[10]
Retirez le x
:
int[10]
Pour votre exemple:
void (*FunctionPtr)()
Ici, l’ declarator-id
est FunctionPtr
. il suffit donc de le supprimer pour obtenir l’ type-id
:
void (*)()
Cela fonctionne car un type-id
vous permet de toujours déterminer où l’identificateur irait pour créer une déclaration. À partir de 8.1.1 dans la norme:
Il est possible d’identifier de manière unique l’emplacement dans [type-id] où l’identificateur apparaîtrait si la construction était une [déclaration]. Le type nommé est alors le même que le type de l’identifiant hypothétique.
Que diriez-vous de cette syntaxe pour plus de clarté? (Note double parenthèse)
void func(); using FunctionPtr = decltype((func));
Une autre approche pourrait utiliser le type de retour automatique avec le type de retour de fin.
using FunctionPtr = auto (*)(int*) -> void;
Cela a l’avantage d’être discutable de pouvoir dire que quelque chose est une fonction ptr lorsque l’alias commence par “auto (*)” et qu’il n’est pas masqué par les noms d’identificateurs.
Comparer
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3);
avec
using FunctionPtr = auto (*)(type1*, type2**, type3) -> someStructureWithAWeirdName&;
Disclaimer: Je l’ai pris de la conversation “Easing into Modern C ++” de Bean Deane