Comment est-ce que je tape un pointeur de fonction avec le C ++ 11 en utilisant la syntaxe?

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(); 

http://ideone.com/e1XuYc

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