Sujet de votre question particulière,
comment pouvons-nous observer le contenu d'un
membre des pointeurs de fonction?
La réponse est, autres que les convertissant en bool d'exprimer qu'il pointe vers quelque chose ou ça ne marche pas, vous ne pouvez pas "observateur" membre des pointeurs de fonction. Au moins pas dans un sens conforme. La raison en est parce que la norme interdit explicitement ceci:
4.12 note de bas de page 57:
57) La règle de conversion de
les pointeurs pour les membres (à partir du pointeur de
membre de la base de pointeur de membre de l'
dérivé) apparaît inversé par rapport à
la règle des pointeurs vers les objets (à partir de
pointeur vers dérivé de pointeur à la base)
(4.10, article 10). Cette inversion est
nécessaires pour assurer la sécurité de type. Note
qu'un pointeur de membre n'est pas un
pointeur vers un objet ou un pointeur vers
la fonction et les règles de conversions
de tels pointeurs ne s'appliquent pas à
des pointeurs vers les membres. En particulier, un
pointeur de membre ne peut pas être converti
pour un void*.
Pour exemple, voici un exemple de code:
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
class Gizmo
{
public:
void DoTheThing()
{
return;
};
private:
int foo_;
};
int main()
{
void(Gizmo::*fn)(void) = &Gizmo::DoTheThing;
Gizmo g;
(g.*fn)(); // once you have the function pointer, you can call the function this way
bool b = fn;
// void* v = (void*)fn; // standard explicitly disallows this conversion
cout << hex << fn;
return 0;
}
Je remarque que mon débogueur (MSVC9) est capable de me dire le réel de l'adresse physique de la fonction de membre au moment de l'exécution, donc je sais qu'il doit y avoir un moyen d'obtenir cette adresse. Mais je suis sûr que c'est de la non-conforme, non-portable et implique sans doute de code machine. Si je devais aller dans cette voie, je voudrais commencer par prendre l'adresse du pointeur de fonction (par exemple, &fn
), conversion de void*, et à partir de là. Cela permettrait également d'exiger de vous que vous connaissez la taille des pointeurs (différents sur les différentes plates-formes).
Mais je voudrais demander, aussi longtemps que vous pouvez convertir les etats-pointeur de fonction bool et d'évaluer l'existence d'un pointeur, pourquoi dans le code réel, auriez-vous besoin de l'adresse?
Sans doute la réponse à la dernière question est "afin que je puisse déterminer si un pointeur de fonction des points à la même fonction que l'autre." Juste assez. Vous pouvez comparer les pointeurs de fonction pour l'égalité:
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
class Gizmo
{
public:
void DoTheThing()
{
return;
};
**void DoTheOtherThing()
{
return;
};**
private:
int foo_;
};
int main()
{
void(Gizmo::*fn)(void) = &Gizmo::DoTheThing;
Gizmo g;
(g.*fn)(); // once you have the function pointer, you can call the function this way
bool b = fn;
// void* v = (void*)fn; // standard explicitly disallows this conversion
cout << hex << fn;
**void(Gizmo::*fnOther)(void) = &Gizmo::DoTheOtherThing;
bool same = fnOther == fn;
bool sameIsSame = fn == fn;**
return 0;
}