2013-05-11 11 views

risposta

127

Ha una sintassi simile, tranne che si rimuove l'identificatore dal puntatore:

using FunctionPtr = void (*)(); 

Ecco un Example

Se si vuole "togliere l'uglyness", provare quello che Xeo suggerito:

#include <type_traits> 

using FunctionPtr = std::add_pointer<void()>::type; 

Ed ecco un altro demo.

+15

Dang, speravo che avrebbe portato via la bruttezza ': (' – rubenvb

+9

@rubenvb: 'using FunctionPtr = AddPointer ;';) – Xeo

+18

@Xeo Non sono del tutto convinto che sia più leggibile. – Cubic

9

Si desidera un type-id, che è essenzialmente esattamente la stessa di una dichiarazione tranne che si elimina il declarator-id. declarator-id è in genere un identificatore e il nome che si dichiara nella dichiarazione di equivillo.

Ad esempio:

int x 

Il declarator-id è x quindi semplicemente rimuovere:

int 

Analogamente:

int x[10] 

Rimuovere il x:

int[10] 

Per esempio:

void (*FunctionPtr)() 

Qui il declarator-id è FunctionPtr. quindi basta rimuoverlo per ottenere il type-id:

void (*)() 

Questo funziona perché data una type-id si può sempre determinare univocamente in cui l'identificatore andrebbe a creare una dichiarazione. Dalla 8.1.1 nella norma:

E 'possibile identificare in modo univoco la posizione nel [tipo-id], dove l'identificatore sembrerebbe se la costruzione fosse una [dichiarazione]. Il tipo named è quindi uguale al tipo dell'identificatore ipotetico .

7

Che ne dici di questa sintassi per chiarezza?(Nota doppia parentesi)

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

Cosa significa la doppia parentesi in questo contesto? Un * riferimento * a un puntatore di funzione? – 0x499602D2

+5

Il tuo 'FunctionPtr' non è un puntatore a funzione, ma' decltype (& f) 'è, vedi [qui] (http://coliru.stacked-crooked.com/view?id=77def487d5ed99885c0523d48c2ae7a1-50d9cfc8a1d350e7409e81e87c2653ba). – rubenvb

+0

@ 1234597890 FunctionPtr è un riferimento a valore non costante al tipo 'void()' –

27

Il "brutto" possono anche essere portati via se si evita typedef-zione un puntatore:

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

http://ideone.com/e1XuYc

Problemi correlati