web-dev-qa-db-fra.com

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

J'aimerais écrire ceci

typedef void (*FunctionPtr)();

en utilisant using. Comment je ferais ça?

151
rubenvb

Sa syntaxe est 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 un autre démo .

161
0x499602D2

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

http://ideone.com/e1XuYc

38
Vadim Goryunov

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

Par exemple:

int x

Le declarator-id est x alors supprimez-le simplement:

int

Également:

int x[10]

Supprimez le x:

int[10]

Pour votre exemple:

void (*FunctionPtr)()

Ici le declarator-id est FunctionPtr. il suffit donc de l'enlever pour obtenir le type-id:

void (*)()

Cela fonctionne car donné un type-id vous pouvez toujours déterminer de manière unique 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 le [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'identificateur hypothétique.

11
Andrew Tomazos

Que diriez-vous de cette syntaxe pour plus de clarté? (Notez la double parenthèse)

void func();
using FunctionPtr = decltype((func));
9
Leo Goodstadt

Une autre approche peut utiliser le type de renvoi automatique avec le type de retour final.

using FunctionPtr = auto (*)(int*) -> void;

Cela a l'avantage de pouvoir dire que quelque chose est une fonction ptr lorsque le pseudonyme commence par "auto (*)" et qu'il n'est pas masqué par les noms d'identifiant.

Comparer

typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);

avec

using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;

Disclaimer: J'ai tiré ceci du discours de Bean Deane intitulé "Passage au C++ moderne"

1
Silvester