J'aimerais écrire ceci
typedef void (*FunctionPtr)();
en utilisant using
. Comment je ferais ça ?
J'aimerais écrire ceci
typedef void (*FunctionPtr)();
en utilisant using
. Comment je ferais ça ?
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 en voici un autre Démonstration .
Il est possible d'utiliser des alias de type de modèle pour nettoyer davantage le système. add_pointer<void()>::type
: En utilisant la suggestion ici : groups.google.com/a/isocpp.org/d/msg/std-propositions/xDQR3y5uTZ0/ vous pouvez écrire pointer<function<void>>
.
Vous voulez un type-id
qui est essentiellement identique à une déclaration, sauf que vous supprimez l'élément declarator-id
. Le site declarator-id
est généralement un identifiant, et le nom que vous déclarez dans la déclaration équivoque.
Par exemple :
int x
El declarator-id
es x
alors il suffit de l'enlever :
int
De même :
int x[10]
Retirer le x
:
int[10]
Pour votre exemple :
void (*FunctionPtr)()
Ici, le declarator-id
es FunctionPtr
. donc il suffit de l'enlever pour obtenir le type-id
:
void (*)()
Cela fonctionne parce que, étant donné un type-id
vous pouvez toujours déterminer de manière unique où l'identifiant irait pour créer une déclaration. 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'identificateur hypothétique. identificateur hypothétique.
Que signifient les doubles parenthèses dans ce contexte ? A référence à un pointeur de fonction ?
Une autre approche consiste à utiliser le type de retour automatique avec le type de retour arrière.
using FunctionPtr = auto (*)(int*) -> void;
Cela présente l'avantage discutable de pouvoir dire que quelque chose est un ptr de fonction lorsque l'alias commence par "auto(*)" et n'est pas obscurci par les noms d'identifiants.
Comparez
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
con
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Clause de non-responsabilité : J'ai tiré ces informations de la conférence "Easing into Modern C++" de Bean Deane.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
2 votes
Très conf.
using
en effet, surtout parce que les identificateurs de pointeur de fonction se trouvaient généralement au milieu d'untypedef
et passer à l'avant en utilisantusing
. En tout cas, c'est là que je suis perdu.