2009-12-19 5 views
2

Je suis en train d'écrire un modèle qui obtient le type d'un functionpointer comme templateargument et le functionpointer correspondant comme un argument de fonction, de façon un exemple simplyfied que je fais ce moment:L'utilisation type de pointeur de fonction comme argument de modèle

int myfunc(int a) 
{ return a; } 

template<typename T, typename Func> struct Test 
{ 
    typedef typeof(myfunc) Fun; 
    static T MyFunc(T val, Func f) 
    { 
     return f(val); 
    } 
}; 

int main(void) 
{ 
    std::cout<<Test<int, typeof(myfunc)>::MyFunc(5, myfunc)<<std::endl; 
} 

Cependant ce code se bloque instantanément. Si je change le type de f à Fun cela fonctionne parfaitement. Alors qu'est-ce que je fais de mal et comment puis-je faire fonctionner cela?

J'utilise MinGW sous Windows Vista si ce comportement dans le cas où le comportement dépend compilateur.

+1

typeof ne fait pas partie de C++, de sorte que ne compile même pas sur mon compilateur –

+0

Compile et fonctionne parfaitement ici. –

+0

'typeof' est une extension GCC. Je suppose que ce n'est pas disponible sur MSVC. – ZoogieZork

Répondre

2

Vous avez vraiment pas besoin de la classe Test pour ce scénario, et pourquoi utiliser ici la fonction typeof?

template< typename T, typename fT > 
T TestMyFunc(T t, fT f) { 
    return f(t); 
}; 

fera, et pas de jongler avec les types de pointeur de fonction:

std::cout << TestMyFunc(5,myfunc) << std::endl; 

Les arguments de modèle sont déduits automatiquement pour les fonctions!

2

typeof est pas valide C++, mais si je remplace vos deux lignes qui les concernent avec ces derniers, puis votre code fonctionne très bien avec soit Fun ou Func dans la définition de MyFunc.

typedef int (*Fun)(int); 

et

std::cout<<Test<int, int(*)(int)>::MyFunc(5, myfunc)<<std::endl; 
+0

Je doutais aussi de la fonction 'typeof' ... – xtofl

Questions connexes