2011-09-21 2 views
0

Je me demandais comment utiliser un modèle avec un pointeur de fonction comme argument. Par exemple,en utilisant des modèles avec des arguments de pointeur de fonction

template<typename T> someFunction(T /*?*/) {} 

où T est un pointeur de fonction (par exemple void (*)(int,int*,double))

Je veux l'utiliser pour contourner la question de la différence pour les pointeurs de fonction de deux fonctions telles que:

void function(int,int); 
void class::function(int,int); 

Donc, si les pointeurs de fonction ne fonctionnent pas, y a-t-il un autre moyen? Edit: Fondamentalement, j'ai besoin de faire une fonction qui accepte une variété de fonctions en utilisant un modèle (tout comme une fonction de modèle ordinaire accepte une variété de variables).

+1

Vous ne pouvez pas "contourner la différence". Une fonction membre n'a aucun sens sans une instance d'accompagnement. En outre, 'class' est un mot réservé en C++. –

Répondre

0

Les pointeurs de fonctions membres sont une bête différente de celle des pointeurs de fonction, par exemple un argument supplémentaire this. Ce n'est pas tout à fait clair ce que vous essayez d'accomplir, ressemble à Boost.Function/Bind aiderait. Notez qu'ils sont standard depuis TR1.

0

Vous pouvez utiliser des foncteurs au lieu de pointeurs sur les fonctions membres. Un exemple:

class SomeFunctor { 
public: 
    void operator()(int i, int* ip, double d) 
    { 
    } 
}; 

void someFunction(int i, int* ip, double d) 
{ 
} 

template<typename T> 
void doSomething(T f) 
{ 
    int i = 0, j = 0; 
    int* ip = &j; 
    double d; 

    f(i, ip, d); 
} 

SomeFunctor someFunctor; 
doSomething(someFunctor); 
doSomething(someFunction); 

Notez que je ne l'ai pas testé ce code et, par conséquent, certaines modifications peuvent être nécessaires pour le compiler.

0

Vous devriez regarder std :: function; c'est une manière généralisée de tenir un "foncteur", ce que vous pouvez appeler. (Voir la réponse de npclaudiu pour un exemple d'un type de foncteur)

Cela étant dit, K-ballo est correct, une fonction membre est différente d'une fonction libre, car elle nécessite un objet. Ceci est généralement implémenté en faisant passer un paramètre masqué; vous pouvez vous y référer comme "ceci".

Alors, quand vous écrivez void my_class::function(int,int);

Le compilateur génère vraiment void my_class::function (my_class*,int,int);

Vous pouvez utiliser std :: bind pour associer des données et fonctions - pour créer foncteurs à la volée. Le meilleur tutoriel que je connaisse est pour Boost.Bind

Questions connexes