Réponses:
Il a une syntaxe similaire, sauf que vous supprimez l'identifiant du pointeur:
using FunctionPtr = void (*)();
Voici un exemple
Si vous voulez "enlever la laideur", essayez ce que Xeo a suggéré:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
Et voici une autre démo .
:(
using FunctionPtr = AddPointer<void()>;)
add_pointer<void()>::type: En utilisant la suggestion ici: groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/ ... vous pouvez écrire pointer<function<void>>.
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();
*dernière et d'obtenir des erreurs déroutantes.
Vous voulez un type-id, qui est essentiellement identique à une déclaration, sauf que vous supprimez le declarator-id. Le declarator-idest généralement un identifiant et le nom que vous déclarez dans la déclaration équivilante.
Par exemple:
int x
L' declarator-idest xdonc enlever juste:
int
Également:
int x[10]
Retirez le x:
int[10]
Pour votre exemple:
void (*FunctionPtr)()
Ici, declarator-idc'est FunctionPtr. alors supprimez-le simplement pour obtenir le type-id:
void (*)()
Cela fonctionne car, étant donné un, type-idvous pouvez toujours déterminer de manière unique où l'identifiant 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'identifiant 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é? (Notez la 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 discutable de pouvoir dire que quelque chose est une fonction ptr lorsque l'alias commence par "auto (*)" et qu'il n'est pas obscurci par les noms d'identifiant.
Comparer
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
avec
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Clause de non-responsabilité: J'ai pris ceci de la conférence "Easing into Modern C ++" de Bean Deane
usingeffet, en particulier parce que les identificateurs de pointeur de fonction résident généralement au milieu d'unetypedefinstruction et se déplacent au premier plan en utilisantusing. Au moins c'est là que je suis perdu.