189 votes

Comment typer un pointeur de fonction avec la syntaxe d'utilisation du C++11 ?

J'aimerais écrire ceci

typedef void (*FunctionPtr)();

en utilisant using . Comment je ferais ça ?

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'un typedef et passer à l'avant en utilisant using . En tout cas, c'est là que je suis perdu.

210voto

0x499602D2 Points 36421

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 .

31 votes

Dang, j'espérais que ça enlèverait la laideur. :(

11 votes

@rubenvb : using FunctionPtr = AddPointer<void()>; ;)

2 votes

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>> .

54voto

Vadim Goryunov Points 1

La "laideur" peut également être supprimée si vous évitez de typographier un pointeur :

void f() {}
using Function_t = void();    
Function_t* ptr = f;
ptr();

http://ideone.com/e1XuYc

0 votes

C'est une approche intéressante, même si j'aurais peur d'oublier les * plus tard et obtenir des erreurs déroutantes.

0 votes

C'est certainement la plus belle version présentée ici. Merci. Et je préfère voir un pointeur, puisqu'il s'agit d'un pointeur de fonction après tout.

13voto

Andrew Tomazos Points 18711

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.

9voto

Leo Goodstadt Points 611

Que diriez-vous de cette syntaxe pour plus de clarté ? (Notez les doubles parenthèses)

void func();
using FunctionPtr = decltype((func));

1 votes

Que signifient les doubles parenthèses dans ce contexte ? A référence à un pointeur de fonction ?

6 votes

Votre FunctionPtr n'est pas un pointeur de fonction, mais decltype(&f) est, voir aquí .

0 votes

@1234597890 FunctionPtr est une référence lvalue non-const de type 'void ()'.

2voto

Silvester Seredi Points 132

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.com

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.

Powered by:

X