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-id
est généralement un identifiant et le nom que vous déclarez dans la déclaration équivilante.
Par exemple:
int x
L' declarator-id
est x
donc enlever juste:
int
Également:
int x[10]
Retirez le x
:
int[10]
Pour votre exemple:
void (*FunctionPtr)()
Ici, declarator-id
c'est FunctionPtr
. alors supprimez-le simplement pour obtenir le type-id
:
void (*)()
Cela fonctionne car, étant donné un, type-id
vous 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
using
effet, en particulier parce que les identificateurs de pointeur de fonction résident généralement au milieu d'unetypedef
instruction et se déplacent au premier plan en utilisantusing
. Au moins c'est là que je suis perdu.