0

Ceci est lié à la génération de code.Comment faire passer un pointeur de fonction à une fonction de membre surchargée en tant que paramètre

I ont une classe A qui est généré à partir du modèle, dans lequel j'ai deux surcharges de fonction f comme ci-dessous:

class A 
{ 
    public: 
    void f(int a){} 
    void f(int a, int b){} 
} 

I ont alors une partie distincte du système qui ne sont pas générées à partir du modèle, mais écrit en C++. Ici, je voudrais accéder à la fonction f sur un objet. À partir du modèle, je peux transmettre des données à la partie du système fabriquée à la main, mais pas l'inverse, puisque le fichier généré n'est pas disponible pour la compilation lorsque je construis mon code artisanal.

Mon idée est de passer un pointeur de fonction du modèle à l'endroit où j'en ai besoin. Ceci, comme je l'ai compris jusqu'à présent, inclut static_cast pour résoudre le problème de surcharge et ensuite je peux passer un pointeur sur la fonction en tant que paramètre à une autre fonction fabriquée à la main.

La fonction utilisée pour passer le pointeur sur la partie fabriqués à la main du système est déclaré comme celui-ci (ici A est inconnue):

void passPointer(int, void (*f)(int, int)); 

Mon appel en fonte et la fonction ressemble:

handCraftedObject->passPointer(17, static_cast<void (A::*)(int, int)> (&A::f)); 

Mon erreur de compilation est:

: no known conversion for argument 2 from 'void (A::*)(int, int)' to 'void (*)(int, int) 

J'espère que cela ne me pas un je dois connaître la classe A où la fonction passant le pointeur de fonction est déclarée. Ce n'est pas possible dans mon système.

+2

Le pointeur de fonction n'est pas identique au pointeur (fonction), le second a besoin d'une instance de classe. – Jarod42

+0

La méthode 'A :: f' doit devenir statique, ou vous devez changer la signature ... – Jarod42

Répondre

2

Le pointeur de fonction de membre a un type différent du pointeur de fonction et ne peut pas être converti en celui-ci. La méthode la plus simple consiste à utiliser boost/std (C++ 11) bind et function.

void passPointer(int, const std::function<void(int, int)>&); 

que juste

handCraftedObject->passPointer 
(
    17, std::bind(static_cast<void (A::*)(int, int)> (&A::f), std::ref(a_instance), 
    std::placeholders::_1, std::placeholders::_2) 
); 

Aussi, vous ne pouvez pas utiliser boost/C++ 11, vous pouvez faire fonctionner fstatic, alors tous fonctionne très bien.