2010-09-22 16 views
6

È possibile utilizzare il tipo di funzione prefissata come puntatore a funzione senza utilizzare typedef?puntatore funzione senza typedef

dichiarazione di funzione:

int myfunc(float); 

uso la dichiarazione di funzione da alcuni sintassi come puntatore a funzione

myfunc* ptrWithSameTypeAsMyFunc = 0; 
+0

Si desidera un puntatore a funzione che può solo indicare la propria funzione delcared? – wheaties

+0

@wheaties Voglio un puntatore a funzione di una funzione con la stessa firma di myfunc –

+1

Sei consapevole che puoi applicare 'typedef' alle dichiarazioni di funzioni per digitare il loro tipo? 'typedef int myfunc (float); myfunc * ptrWithSameTypeAsMyFunc = 0; '? Molte persone non ne sono consapevoli e pensano di aver bisogno della brutta sintassi '(* foo)'. –

risposta

20

Non secondo lo standard del 2003. Sì, con il moderno standard C++ 0x e MSVC 2010 e g ++ 4.5:

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0; 
+0

sembra bello - controllerà questo ... –

+0

il problema è che il mio codice non viene compilato con C++ 0x abilitato. Quindi questa non è una soluzione utilizzabile per me: S –

+0

Con g ++ puoi usare 'typeof (myfunc)' invece di 'decltype (myfunc)' e funziona anche in modalità non C++ 0x. –

6

Sì, è possibile dichiarare un puntatore a funzione senza un typedef, ma no, non è possibile utilizzare il nome di un funzione per farlo.

Il typedef viene in genere utilizzato perché la sintassi per la dichiarazione di un puntatore a funzione è un po 'barocca. Tuttavia, il typedef non è richiesto. È possibile scrivere:

int (*ptr)(float); 

per dichiarare ptr come un puntatore a funzione a una funzione di prendere float e il ritorno int - non typedef è coinvolto. Ma ancora una volta, non esiste una sintassi che ti permetta di usare il nome myfunc per farlo.

0
int (*ptrWithSameTypeAsMyFunc)(float) = 0; 

Vedere here per ulteriori informazioni sulle nozioni di base.

1

No, non al momento. C++ 0x cambierà il significato di auto e aggiungerà una nuova parola chiave decltype che ti consente di fare cose come questa. Se stai usando gcc/g ++, potresti anche usare l'operatore typeof, che è abbastanza simile (ha una sottile differenza quando si tratta di riferimenti).

1

No, non senza C++ 0x decltype:

int myfunc(float) 
{ 
    return 0; 
} 

int main() 
{ 
    decltype (myfunc) * ptr = myfunc; 
} 
1

gcc ha typeof come estensione per C (non so su C++) (http://gcc.gnu.org/onlinedocs/gcc/Typeof.html).

int myfunc(float); 

int main(void) { 
    typeof(myfunc) *ptrWithSameTypeAsMyFunc; 
    ptrWithSameTypeAsMyFunc = NULL; 
    return 0; 
} 
+4

GCC non ha bisogno dell'estensione 'typeof' in C++ perché implementa il (presto standard)' decltype', che ha praticamente lo stesso scopo. – MSalters

3

È posible per usare il tipo di una funzione prefiously dichiarato come un puntatore a funzione senza utilizzare un typedef?

ho intenzione di imbrogliare un po '

template<typename T> 
void f(T *f) { 
    T* ptrWithSameTypeAsMyFunc = 0; 
} 

f(&myfunc); 

Naturalmente, questo non è del tutto privo di insidie: Si utilizza la funzione, quindi deve essere definito, mentre cose come decltype non usare la funzione e non richiedono la definizione della funzione.

Problemi correlati