2010-09-22 24 views
6

Est-il possible d'utiliser le type d'une fonction préfusément déclarée comme pointeur de fonction sans utiliser de typedef?pointeur de fonction sans typedef

déclaration de fonction

:

int myfunc(float); 

utiliser la déclaration de fonction par une syntaxe comme pointeur de fonction

myfunc* ptrWithSameTypeAsMyFunc = 0; 
+0

Vous voulez un pointeur de fonction qui ne peut pointer que vers votre propre fonction supprimée? – wheaties

+0

@wheaties Je veux un pointeur de fonction à une fonction avec la même signature que myfunc –

+1

Savez-vous que vous pouvez appliquer 'typedef' aux déclarations de fonctions pour typedef leur type? 'typedef int myfunc (float); myfunc * ptrWithSameTypeAsMyFunc = 0; '? La plupart des gens ne sont pas conscients de cela et pensent qu'ils ont besoin de la syntaxe laide (* foo) '. –

Répondre

20

Non selon la norme 2003. Oui, avec le futur standard C++ 0x et MSVC 2010 et g ++ 4.5:

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0; 
+0

semble bien - va vérifier cela ... –

+0

le problème est mon code ne compile pas avec C++ 0x activé. Donc ce n'est pas une solution utilisable pour moi: S –

+0

Avec g ++ vous pouvez utiliser 'typeof (myfunc)' au lieu de 'decltype (myfunc)' et cela fonctionne même en mode non-C++ 0x. –

6

Oui, il est possible de déclarer un pointeur de fonction sans typedef, mais pas il est impossible d'utiliser le nom d'un fonction pour le faire.

Le typedef est généralement utilisé car la syntaxe pour déclarer un pointeur de fonction est un peu baroque. Cependant, le typedef n'est pas requis. Vous pouvez écrire:

int (*ptr)(float); 

à déclarer ptr comme un pointeur de fonction à une fonction prise float et retour int - pas typedef est impliqué. Mais encore une fois, il n'y a pas de syntaxe qui vous permettra d'utiliser le nom myfunc pour ce faire.

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

Voir here pour plus d'informations sur les bases.

1

Non, pas pour le moment. C++ 0x va changer la signification de auto, et ajouter un nouveau mot-clé decltype qui vous permet de faire des choses comme ça. Si vous utilisez gcc/g ++, vous pouvez également utiliser son opérateur typeof, ce qui est assez similaire (il y a une différence subtile lorsqu'il s'agit de références).

1

Non, non sans C++ 0x decltype:

int myfunc(float) 
{ 
    return 0; 
} 

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

gcc a typeof comme une extension C (ne sais pas C++) (http://gcc.gnu.org/onlinedocs/gcc/Typeof.html).

int myfunc(float); 

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

GCC n'a pas besoin de l'extension 'typeof' en C++ car il implémente le' decltype' (qui sera bientôt standard), qui sert à peu près le même but. – MSalters

3

Est-il d'utiliser le posible type d'une fonction déclarée prefiously comme pointeur de fonction sans l'aide d'un typedef?

Je vais tricher un peu

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

f(&myfunc); 

Bien sûr, ce n'est pas tout à fait sans embûches: Il utilise la fonction, il faut définir, alors que des choses telles que decltype ne pas utiliser la fonction et ne nécessitent pas la fonction à définir.