J'aimerais écrire ceci
typedef void (*FunctionPtr)();
en utilisant using
. Comment je ferais ça?
La "laideur" peut également être supprimé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 le declarator-id
. Le declarator-id
est généralement un identifiant et le nom que vous déclarez dans la déclaration équivalente.
Par exemple:
int x
Le declarator-id
est x
alors supprimez-le simplement:
int
Également:
int x[10]
Supprimez le x
:
int[10]
Pour votre exemple:
void (*FunctionPtr)()
Ici le declarator-id
est FunctionPtr
. il suffit donc de l'enlever pour obtenir le type-id
:
void (*)()
Cela fonctionne car donné un type-id
vous pouvez toujours déterminer de manière unique 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 le [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'identificateur hypothétique.
Que diriez-vous de cette syntaxe pour plus de clarté? (Notez la double parenthèse)
void func();
using FunctionPtr = decltype((func));
Une autre approche peut utiliser le type de renvoi automatique avec le type de retour final.
using FunctionPtr = auto (*)(int*) -> void;
Cela a l'avantage de pouvoir dire que quelque chose est une fonction ptr lorsque le pseudonyme commence par "auto (*)" et qu'il n'est pas masqué par les noms d'identifiant.
Comparer
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
avec
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Disclaimer: J'ai tiré ceci du discours de Bean Deane intitulé "Passage au C++ moderne"